此问题与Should my Scala actors' properties be marked @volatile?类似,但不确定答案是否相同。
例如,如果配置了fork-join调度程序并且actor的状态没有被@volatile标记,那么是否保证actor的状态将通过缓存层次结构从一个核心(或处理器)传播到另一个如果fork / join工作线程在不同的核心(或处理器)上运行?
P.S。在JSR133之后只有一次写入/读取操作到/从任何易失性变量执行刷新缓存到主内存并在其他核心(或处理器)上运行的其他线程上看到来自此线程的所有前面的非易失性写入,这是正确的吗?如果是,则可以回答,因为扫描工作队列会执行一些读数并从/向FJ任务的volatile变量写入。
答案 0 :(得分:5)
不,你不应该在你的actor领域放置volatile。为什么?
如果演员在处理a时对其内部状态进行了更改 消息,并在处理另一条消息时访问该状态 片刻之后。重要的是要认识到演员模型 你不能保证同一个线程将执行 不同消息的同一个演员。
一切都在这里:http://doc.akka.io/docs/akka/2.0/general/jmm.html
关于您的PS,您需要读取/写入相同的volatile字段以获得之前发生的保证。阅读“volatile piggybacking”