Java多執行緒synchronized、ReentrantLock、ReentrantReadWriteLock 和StampedLock 的對比
阿新 • • 發佈:2019-02-04
- synchronized是在JVM層面上實現的,可以通過一些監控工具控制synchronized的鎖定,當代碼出現異常時,JVM會自動釋放鎖定。當只有少量競爭者的時候,synchronized是一個很好的通用的鎖實現。synchronized的鎖是針對一個物件的。
- ReentrantLock、ReentrantReadWriteLock 和StampedLock都是程式碼層面的鎖定,要保證鎖一定會被釋放,就必須將unLock()放到final{}中。
- synchronized放在函式或區域性程式碼塊中。
- ReentrantLock是一個很好的通用的鎖實現,適用於相對比較簡單的加鎖解鎖的業務邏輯,如果實現複雜的鎖機制,當執行緒增長能夠預估時也是可以的。
- ReentrantReadWriteLock對鎖又進行了擴充套件,引入了read和write阻塞和併發機制,相對於ReentrantLock,他可以實現更復雜的鎖機制,且併發性也更高些。
- StampedLock又在Lock的基礎上,實現了可以滿足樂觀鎖和悲觀鎖等一些在讀執行緒越來越多的業務場景,對吞吐量有巨大的改進,但並不是說要替代Lock,畢竟他還是有些應用場景的。
- 如果不是非得需要,應該儘量使用ReentrantLock和ReentrantReadWriteLock。 -