7

Scala では、次のような単純なクラスがあるとします。

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

フィールドsumにマークを付ける必要があり@volatileますか? アクターは論理的にシングルスレッド(つまり、メッセージが順次処理される) ですが、個々の反応は別々のスレッドで発生する可能性があるため、state変数が 1 つのスレッドで変更され、別のスレッドから読み取られる可能性があります。

4

1 に答える 1

6

それらを揮発性としてマークする必要はありません。コードの実行は同期ブロック内ではありませんが、アクターはコードが呼び出される前に常に同期ブロックを通過するため、メモリはスレッド間で一貫した状態になります。

于 2009-06-23T11:31:09.803 に答える