樂觀鎖和悲觀鎖

2021-10-20 06:40:33 字數 756 閱讀 6511

執行緒每次訪問能同步資源時,會給運算元據加鎖,保證臨界區的程式同一時間只能有乙個執行緒執行。沒獲得鎖線程會進入阻塞佇列。等待再次獲取鎖。

又稱為「無鎖」。通過cas技術保證執行緒執行的安全性。

樂觀鎖適用於讀多寫少的場景,避免頻繁加鎖影響效能;

悲觀鎖適用於寫多讀少的場景,避免頻頻繁失敗和重試影響效能。

cas全稱(compare and swap)比較並替換,是一種無鎖演算法。在cas中,有3個值:

v:要更新的記憶體位址;

e: 舊值

n:新值

當且僅當v的值等於e時,將v的值修改為n,否則什麼都不做。

當多個執行緒同時使用cas操作乙個變數時,只有乙個會成功,其餘都會失敗。失敗的可允許再次嘗試或者放棄操作。

(1)aba問題

描述:乙個值原來是a,變成了b ,又變成了a;這時候cas是檢測不出變化的,但實際上是被更新了兩次。

解決思路:在變數前面加版本號或者時間戳。

(2)迴圈時間開銷大

描述:cas多與自旋結合,如果自旋cas長時間不成功,會占用大量的cpu資源;

解決思路:讓jvm支援處理器提供的pause指令。

pause指令:讓自旋失敗時,失眠一小時再繼續自旋,降低讀的操作頻率。

(3)只能保證乙個物件的原子操作;

解決思路:1.使用jdk1.5就開始提供的automicreference類保證物件之間的原子性,把多個變數放在乙個物件裡進行cas操作;

2.使用鎖,鎖內的臨界區**可以保證只有當前執行緒能夠操作。

樂觀鎖和悲觀鎖

1 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...

樂觀鎖和悲觀鎖

併發衝突 在多使用者的環境下,如果使用者同時修改同乙個文件,就會造成衝突。典型的衝突有兩種 1 丟失更新 乙個使用者的更新記錄覆蓋了另乙個人的更新。如 使用者一 讀 寫 使用者二 讀 寫 那麼使用者一就把使用者二的更新覆蓋了。2 髒讀 乙個使用者更新資料未完成時,另乙個使用者就讀取資訊。使用者一 讀...

樂觀鎖和悲觀鎖

為什麼需要鎖 併發控制 在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這會產生衝突。這就是著名的併發性問題。典型的衝突有 l 丟失更新 乙個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如 使用者a把值從6改為2,使用者b把值從2改為6,則使用者a丟失了他的更新。l 髒讀...