2016-03-05 57 views
0

我有兩個演員和一個存儲庫,這是安全的嗎?演員主題安全

def incRepo = { 
    val acc = Repo get "account" 
    Repo set "account" = acc + 1 
} 

Actor1 = Actor2 = def receive = { 
    case inc => 
    incRepo 
} 

回答

4

不。有競爭條件,因爲演員在不同的線程中執行。即。 Actor1執行get操作。然後Actor2執行整個incRepo幾次。然後Actor1執行set操作。

您可能希望查看ScalaSTM庫中的「軟件事務內存」。

您將創建共享Ref並使incRepoatomic函數。當多個線程輸入atomic塊時,兩者都繼續。寫入Ref的第一個線程獲勝,失敗者從頭開始重新啓動atomic塊。因此,這兩個線程將始終與最新的數據一起工作。

https://nbronson.github.io/scala-stm/

STM是鎖和互斥的替代,但具有更好的併發性,因爲它使用,而不是阻塞寫入與讀取樂觀無阻塞寫道。編寫和維護STM代碼比使用鎖定代碼更容易。