樂觀鎖和悲觀鎖經常被詢問到,在這裡做一些總結
一.基礎概念
樂觀鎖和悲觀鎖一般是用來維持事務的完整性.來解決併發場景中的資料競爭問題
二.實現方式
cas(compare and swap)
cas操作邏輯: 如果記憶體位置等於預期的值,則將位置更新為新值,不然不進行操作.許多cas的操作是自旋的,如果操作不成功,會一直重新,知道操作成功
版本號機制
版本號機制的思路是在資料中增加乙個字段,每當資料被修改的時候,版本號加1.當某個執行緒查詢資料的時候,將資料的版本號一起查出來,當該執行緒更新資料的時候,判斷當前版本號與之前是不是一致,如果一致進行操作
悲觀鎖是呼叫的時候進行加鎖,使用完之後就不用加鎖
三.優缺點和適用場景
1.功能限制
cas只能保證單個變數的原子性,涉及到多個變數,cas是無能為例
2.競爭激烈程度
競爭不激烈的時候,樂觀鎖是更有優勢的,加鎖和解鎖都需要消耗資源
競爭激烈的時候,悲觀鎖是更有優勢的
3.樂觀鎖是不佳鎖的,只是判斷資料有沒有被其他執行緒進行更新
四.cas有哪些缺點?
1.aba 問題
(1) 執行緒1讀取記憶體資料為a
(2) 執行緒2將資料修改為b
(3) 執行緒2將資料修改為a
(4) 執行緒1進行cas操作
這種情況的cas會成功的,但是資料已經被修改過了 , 但是在乙個棧頂經過兩次或多次變化恢復原值,棧已經發生了變化
引入版本號,記憶體中的值發生一次變化,版本號都+1,進行cas操作的時候,不僅僅需要比較記憶體中的值,還需要比較版本號的值,這樣cas才能成功
2.高競爭下的開銷問題
併發衝突很大的情況下,cas不斷的進行自選,我們可以在這裡進行乙個閥門測試,如果重新嘗試的次數超過一定的值會失敗退出
樂觀鎖和悲觀鎖
1 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...
樂觀鎖和悲觀鎖
併發衝突 在多使用者的環境下,如果使用者同時修改同乙個文件,就會造成衝突。典型的衝突有兩種 1 丟失更新 乙個使用者的更新記錄覆蓋了另乙個人的更新。如 使用者一 讀 寫 使用者二 讀 寫 那麼使用者一就把使用者二的更新覆蓋了。2 髒讀 乙個使用者更新資料未完成時,另乙個使用者就讀取資訊。使用者一 讀...
樂觀鎖和悲觀鎖
為什麼需要鎖 併發控制 在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這會產生衝突。這就是著名的併發性問題。典型的衝突有 l 丟失更新 乙個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如 使用者a把值從6改為2,使用者b把值從2改為6,則使用者a丟失了他的更新。l 髒讀...