0
我有兩個演員和一個存儲庫,這是安全的嗎?演員主題安全
def incRepo = {
val acc = Repo get "account"
Repo set "account" = acc + 1
}
Actor1 = Actor2 = def receive = {
case inc =>
incRepo
}
我有兩個演員和一個存儲庫,這是安全的嗎?演員主題安全
def incRepo = {
val acc = Repo get "account"
Repo set "account" = acc + 1
}
Actor1 = Actor2 = def receive = {
case inc =>
incRepo
}
不。有競爭條件,因爲演員在不同的線程中執行。即。 Actor1執行get
操作。然後Actor2執行整個incRepo
幾次。然後Actor1執行set
操作。
您可能希望查看ScalaSTM庫中的「軟件事務內存」。
您將創建共享Ref
並使incRepo
爲atomic
函數。當多個線程輸入atomic
塊時,兩者都繼續。寫入Ref
的第一個線程獲勝,失敗者從頭開始重新啓動atomic
塊。因此,這兩個線程將始終與最新的數據一起工作。
https://nbronson.github.io/scala-stm/
STM是鎖和互斥的替代,但具有更好的併發性,因爲它使用,而不是阻塞寫入與讀取樂觀無阻塞寫道。編寫和維護STM代碼比使用鎖定代碼更容易。