我的Scala actor的属性应该标记为@volatile吗?
-
06-07-2019 - |
题
在Scala中,如果我有一个简单的类,如下所示:
val calc = actor {
var sum = 0
loop {
react {
case Add(n) =>
sum += n
case RequestSum =>
sender ! sum
}
}
}
我的字段 sum
是否应标记为 @volatile
?虽然演员是逻辑单线程(即消息是按顺序处理的),但各个反应可能发生在不同的线程上,因此 state
变量可能会被改变一个线程,然后从另一个线程读取。
解决方案
您不需要将它们标记为易失性。代码的执行不在同步块中,但是在调用代码之前,actor总是会通过一个代码,从而迫使内存跨线程进入一致状态。
不隶属于 StackOverflow