在此 Scala 示例中,同步是如何工作的?

How does synchronization work in this scala example?

我是 scala 的新手,正在努力适应这门语言。我一直在寻找与以下 Java 同步技术等效的方法。

private final Map<String, Future<Boolean>> requestMap = new HashMap<>();

public void updateMap(String key) {
    synchronized(requestMap) {
        // update contents of requestMap
    }
}

我认为下面的语法是上面 Java 的 Scala 等价物。

private val requestMap = new mutable.LinkedHashMap[String, Future[Boolean]]

def updateMap(key: String): Unit = {
    requestMap.synchronized {
        // update contents of requestMap
    }
}

我在这里试图实现的是确保只有一个线程可以在 updateMap 方法中的任何给定时间操作 requestMap 对象。我想知道上面的两个例子是否等效,我在哪里可以找到 synchronized 的 Scala 用法记录?

你是对的,这些是等价的:

//Java
synchronized(foo) { statements ... }

//Scala
foo.synchronized { statements ... }

在 scala 中,synchronized 是一个库构造(尽管是 合成的 一个)——也就是说,它是 a method on AnyRef

参考相同的讨论,我们可以有这样的东西吗?它会使 AnyRef.synchronized 中的代码,线程安全吗?

Object abc {
 ...
    *AnyRef*.synchronized{
       val ff = new FunClass()
       ff.displayTs()
    }

}

class FunClass() {
  def displayTs(): Unit{
    println(timestamp)
  }
}

...
}