歸納避免同步鎖的幾種方式

ggd543archer發表於2018-07-28

在併發程式設計中, 經常需要對共享資料(物件)新增同步鎖, 但同步鎖會導致程式效能下降。下面總結了一些避免同步鎖的方法:

無狀態

因為物件內部不維護狀態,自然就沒有併發修改問題。如果一個伺服器程式不儲存使用者的狀態,那麼就可以很容易進行橫向擴容。

使用不變物件

當物件狀態發生改變時,重新生成物件。在javascript提供建立不可變物件的介面,但可以使用immutable.jsseamless-immutable建立不可變物件。

通過函式呼叫棧傳遞物件引用

物件都在堆空間分配,並可以被多個執行緒引用。如果物件引用只在函式呼叫棧之間傳遞,則只有當前執行緒能引用該物件

對集合進行分割槽

JDK的java.util.ConcurrentHashMap 就是使用這種思想來實現的。 詳情見 . 此方法不能避免鎖,但可以提高併發量

通過訊息傳遞狀態

物件之間通過訊息互動,物件內部不儲存狀態。典型的例子:Actor模型。

使用單執行緒非同步

單執行緒多工:每個任務的執行不能被打斷。 程式監聽各種事件並提供相應的回撥函式

典型例子:nodejs


相關文章