淺談悲觀鎖和樂觀鎖

悲觀鎖定義:

假設每一次操作都認爲會對數據進行修改,然後對資源進行加鎖,一個線程進行操作時,其他線程需要等待,下一個線程直到當前線程完全釋放鎖才能拿到鎖。數據庫的鎖基本都是這種(行鎖、表鎖、讀/寫鎖等) 還有java裏的常見的synchronized關鍵字也是悲觀鎖。

 

樂觀鎖定義:

與悲觀鎖相反,樂觀鎖假設每一次操作都認爲不會對數據進行修改,所以都不會加鎖,但是樂觀鎖會在更新時判斷下線程操作期間中數據是否有被修改過,一般基於版本號機制實現(CAS算法)

栗子:

線程A要修改一條數據,當前數據版本號字段爲1, A完成修改動作後版本號++, 判斷當前A的版本號2>版本號字段1,提交修改。

而這時線程B也同時對這條數據進行操作(數據當前版本號爲1),B完成修改動作後版本號++,判斷當前B的版本號2不大於當前數據版本號字段2(因爲這裏已經被線程A修改了),B線程提交操作被拒絕。

 

應用場景

悲觀鎖應用於寫多讀少的情況下,因爲寫多代表線程衝突頻繁,資源競爭激烈。

樂觀鎖大多應用於度多寫少的情況下,可以省去鎖的開銷,提高性能加大系統吞吐量。

 

發佈了6 篇原創文章 · 獲贊 1 · 訪問量 796
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章