【问题标题】:Should my Scala actors' properties be marked @volatile?我的 Scala 演员的属性是否应该标记为 @volatile?
【发布时间】:2010-11-05 02:16:00
【问题描述】:

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

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

我的字段sum 是否应该标记为@volatile?虽然参与者是逻辑上单线程(即消息按顺序处理),但个别反应可能发生在不同的线程上,因此state 变量可能会在一个线程上被更改然后读取来自另一个。

【问题讨论】:

    标签: scala thread-safety volatile actor


    【解决方案1】:

    您无需将它们标记为易失性。代码的执行不在同步块内,但参与者在调用代码之前总是会经过一个同步块,从而强制内存跨线程进入一致状态。

    【讨论】:

    • 那么这不是对 Erlang 的重大背离吗?这意味着参与者在添加核心方面也不是完全可扩展的——除非它们是完全无状态的。
    • 演员框架不能使用 util.concurrent.Exchanger 在线程之间传递状态吗?
    • 如果某物的当前值仅在一个 CPU 的寄存器中,而陈旧值在共享缓存或 RAM 中,那么另一个 CPU 完全有可能看到该陈旧值。 @volatile 告诉 JVM,当一个值在一个地方更新时,该更新需要在另一个线程尝试访问该值之前向下传播(好吧,我在这里简化了......)。同样,同步触发 JVM 以确保所有不同级别的内存处于一致状态。这是处理多核时的普遍问题。
    • 这只是上面声明的演员的情况吗?例如,如果 actor 是 Actor 的子类并覆盖了 act() 方法,引用了在类中其他地方声明的非易失性属性,该怎么办。我在演员代码库中看不到任何暗示这是线程安全的
    • @oxbow_lakes:您可能想在这里查看我的问题的公认答案:stackoverflow.com/questions/12399414/… ...我认为他解释得很好,它实际上是如何同步的以及如何在何时使用演员需要多核性能。
    猜你喜欢
    • 1970-01-01
    • 2011-09-27
    • 2011-10-23
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    相关资源
    最近更新 更多