scala - 我的 Scala Actor 的属性是否应该标记为@volatile?

标签 scala thread-safety volatile actor

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

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

如果我的领域sum被标记@volatile ?虽然参与者在逻辑上是单线程的(即消息是按顺序处理的),但各个 react 可能发生在不同的线程上,因此 state变量可能在一个线程上被更改,然后从另一个线程读取。

最佳答案

您不需要将它们标记为 volatile 。代码的执行不在同步块(synchronized block)内,但参与者总是在调用代码之前通过一个同步块(synchronized block),从而强制内存跨线程进入一致状态。

关于scala - 我的 Scala Actor 的属性是否应该标记为@volatile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1031167/

相关文章:

multithreading - 有没有办法强制一个进程与另一个进程共享地址空间?

c++ - 标准在哪里定义 volatile 变量可以更改?

scala - 在等级制度中选择 Actor 的好方法是什么?

java - 在 Scala 中,如何像 Ruby 的 .pack (“N” 那样打包 BigInt,将四个字符视为网络字节顺序中的无符号长整型?

java - 用于任意可克隆数据的线程安全持有者

java - 使用 Component.createImage(ImageProducer) 和自定义 ImageProducer 在 Java 中创建图像

c# - "volatile"关键字是做什么用的?

java - 我应该用同步方法改变字段吗?

scala - 如何使私有(private)成员对象封装?

scalatest 调用不带括号