2014年5月5日 星期一

synchronized、ReentrantLock 與 ReentrantReadWriteLock

在多執行緒的環境下,為了避免在多執行緒的狀況中產生資料不一致的結果
常利用上鎖機制去鎖定資源,藉此來控制只能有單一執行緒操作特定資源。
而 Java 7 當中,常用的上鎖的方法大概是 synchronized、ReentrantLock 與 ReentrantReadWriteLock。

以下的內容主要是 [1] 的大綱(雖然 [1] 主要要講的是 Java 8 提供的樂觀鎖 XD)
因此就不重複貼範例程式碼了,內容也僅僅簡要地寫下差異。

synchronized 之前曾經寫過簡單的文章提過,主要缺點在於當某個程序存取到已經被其他執行緒上鎖的區段時,程序會因此被阻斷
而如果希望程序能夠在等待的期間做點別的事情,就需要考慮其他解決方法了。

ReentrantLock 在功能上很類似 synchronized,但彈性又比 synchronized 來得大。
透過設計可以做到跟 synchronized 一樣的功能,但也可以衍生其他的功能。
其中如果是想允許對某個資源的寫入只能單一執行緒寫入、讀取可以允許多執行緒同時讀取時,更好的選項是 ReentrantReadWriteLock。

參考資料:
1、【JDK8】從 synchronized、Lock 到 StampedLock

沒有留言: