不変のスカラコレクションを安全に更新するための「簡単な」方法があるかどうかは疑問でした。次のコードを検討してください:Scalaコレクションをスレッドセーフに更新する
class a {
private var x = Map[Int,Int]()
def update(p:(Int,Int)) { x = x + (p) }
}
このコードはスレッドセーフではありませんが、正しいですか?これは、updateメソッドを呼び出す2つのスレッドがあり、xが{1 => 2}のマップであり、スレッドAがupdate((3,4))を呼び出すとx +(p)を実行するだけの場合、コードの一部。その後、再スケジューリングが発生し、スレッドBはupdate((13,37))を呼び出し、変数xを正常に更新します。スレッドAは継続して終了します。
これで、値xは{1 => 2、3 => 4}のマップと等しくなりますか?希望の{1 => 2,3、> 4,13 => 37}の代わりに。それを修正する簡単な方法はありますか?
Btw、私はAkka STMのようなソリューションがあることを知っていますが、私は必要がない限り、それらを使用したくないと思います。
ありがとうございました!
編集:また、私はロックなしの解決策を好むでしょう。 Eeeew :)
使用アッカSTM http://akka.io/docs/akka/1.1.3/ scala/stm.html – Phil
+! Eeeewのために! :D – Daniel