10

这个问题类似于是否应该将我的 Scala 演员的属性标记为 @volatile?但不确定答案是否相同。

例如,如果配置了 fork-join 调度程序并且参与者的状态未由 @volatile 标记,是否保证参与者的状态将通过缓存层次结构从一个内核(或处理器)传播到另一个内核(或处理器)如果 fork /join 工作线程在不同的内核(或处理器)上运行?

PS 在 JSR133 之后,只有一个对任何易失性变量的写入/读取操作需要将缓存刷新到主内存并在其他内核(或处理器)上运行的其他线程上查看该线程的所有先前非易失性写入,这对吗?如果是,则可以回答,因为扫描工作队列会从/写入 FJ 任务的易失性变量。

4

1 回答 1

5

不,您不应该将 volatile 放在您的演员字段上。为什么?

如果参与者在处理消息时对其内部状态进行了更改,并在稍后处理另一条消息时访问该状态。重要的是要意识到,使用 Actor 模型,您无法保证同一个线程将为不同的消息执行同一个 Actor。

都在这里:http ://doc.akka.io/docs/akka/2.0/general/jmm.html

关于您的 PS,您需要读取/写入相同的易失性字段以获得发生前的保证。阅读“不稳定的捎带”

于 2012-04-15T22:31:45.050 回答