樂觀鎖、悲觀鎖是從其使用角度來看,(PS:比如ReentrantLock內部實作用到了CAS和自旋來提高性能,但是從其使用角度來看,是用到了悲觀鎖的思想,)
1. 樂觀鎖
樂觀鎖:顧名思義就是在操作時很樂觀,認為操作不會產生并發問題(不會有其他執行緒對資料進行修改),因此不會上鎖,但是在更新時會判斷其他執行緒在這之前有沒有對資料進行修改,一般會使用版本號機制或CAS(compare and swap)演算法實作,(PS:CAS是原子指令)
簡單理解:這里的資料,別想太多,你盡管用,出問題了再修復,即操作失敗后事務回滾、提示、更新資料,
原子類的通用實作:
- 宣告共享變數為volatile
- 使用CAS的原子更新來實作執行緒之間的同步
- volatile變數的讀/寫和CAS所具有的volatile讀和寫的記憶體語意來實作執行緒之間的通信
2. 悲觀鎖
悲觀鎖:總是假設最壞的情況,每次取資料時都認為其他執行緒會修改,所以都會加(悲觀)鎖,一旦加鎖,當不同執行緒同時執行時,只會有一個執行緒可以執行,其他的執行緒在入口處等待,直到鎖被釋放,
3. 兩種鎖的使用場景
從上面對兩種鎖的介紹,我們知道兩種鎖各有優缺點,不能認為一種好于另一種:
- 樂觀鎖適用于寫比較少的場景下(多讀場景),即沖突真的很少發生的時候,這樣可以省去了鎖的開銷,加大了系統的整個吞吐量,但如果是多寫的情況,一般會經常產生沖突,這就會導致上層應用會不斷的進行retry,這樣反倒是影響了性能
- 悲觀鎖適用于寫比較多的場景下
4. 參考資料
- 面試必備之樂觀鎖與悲觀鎖
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/3850.html
標籤:其他
下一篇:Java面試—訊息佇列
