我的Scala actor的属性应该标记为@volatile吗?

oxb*_*kes 7 scala volatile thread-safety actor

在Scala中,如果我有一个简单的类,如下所示:

val calc = actor {
  var sum = 0
  loop {
    react {
      case Add(n) => 
        sum += n
      case RequestSum =>
        sender ! sum
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我的领域sum应该被标记@volatile吗?虽然actor在逻辑上单线程的(即消息是按顺序处理的),但各个反应可能发生在不同的线程上,因此state变量可能在一个线程上被改变,然后从另一个线程读取.

Eri*_*cht 6

您不需要将它们标记为易失性.代码的执行不在同步块中,但是在调用代码之前,actor总是会通过一个代码,从而迫使内存跨线程进入一致状态.