我想知道是否有任何'簡單'的方法來安全地更新不可變的scala集合。考慮以下代碼:線程安全地更新Scala集合
class a {
private var x = Map[Int,Int]()
def update(p:(Int,Int)) { x = x + (p) }
}
此代碼不是線程安全的,正確的?我的意思是,如果我們有兩個線程調用update方法,並且讓x表示包含{1 => 2}的map並且線程A調用update((3,4))並且只管理執行x +(p)部分代碼。然後重新調度發生,線程B調用更新((13,37))併成功更新變量x。線程A繼續並結束。
畢竟這完成後,值x將等於包含{1 => 2,3 => 4}的地圖,是正確的嗎?而不是所需的{1 => 2,3 => 4,13 => 37}。有沒有簡單的方法來解決這個問題?我希望它是難以置信的,我問:)
順便說一句,我知道有像Akka STM的解決方案,但我寧願不使用這些,除非必要。
非常感謝任何答案!
編輯:此外,我寧願解決方案沒有鎖定。 Eeeew :)
使用Akka STM http://akka.io/docs/akka/1.1.3/ scala/stm.html – Phil
+!對於Eeeew! :D – Daniel