悲觀鎖與樂觀鎖以及樂觀鎖的實現

2021-10-19 11:56:20 字數 937 閱讀 6730

總是假設最壞的情況,每次去拿資料的時候都認為別人會修改,所以每 次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會阻塞直到它拿到鎖。傳 統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫 鎖等,都是在做操作之前先上鎖。

顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所 以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號等機制。樂觀鎖適用於多讀的應用型別,這樣可以提高吞吐量,像資料庫提供的類似於 write_condition 機制,其實都是提供的樂觀鎖。

1、使用版本標識來確定讀到的資料與提交時的資料是否一致。提交後修改版本標 識,不一致時可以採取丟棄和再次嘗試的策略。

2、compare and swap 即 cas ,當多個執行緒嘗試使用 cas 同時更新 同乙個變數時,只有其中乙個執行緒能更新變數的值,而其它執行緒都失敗,失敗的 執行緒並不會被掛起,而是被告知這次競爭中失敗,並可以再次嘗試。 cas 操作 中包含三個運算元 —— 需要讀寫的記憶體位置(v)、進行比較的預期原值(a)和擬寫入的新值(b)。如果記憶體位置 v 的值與預期原值 a 相匹配,那麼處理器會自動將該位置值更新為新值 b。否則處理器不做任何操作。

1、aba 問題:

比如說乙個執行緒1 從記憶體位置 v 中取出 a,這時候另乙個執行緒2也從記憶體中 取出 a,並且 執行緒2進行了一些操作變成了 b,然後執行緒2又將 v 位置的資料變成 a,這時候執行緒1 進行 cas 操作發現記憶體中仍然是 a,然後執行緒1操作成功。儘管執行緒1 的 cas 操作成功,但可能存在潛藏的問題。

2、迴圈時間長開銷大:

對於資源競爭嚴重(執行緒衝突嚴重)的情況,cas 自旋的概率會比較大,從而浪費更多的 cpu 資源。

3、只能保證乙個共享變數的原子操作:

當對乙個共享變數執行操作時,我們可以使用迴圈 cas 的方式來保證原子操作,但是對多個共享變數操作時,迴圈 cas 就無法保證操作的原子性,這個時候就可以用鎖。

悲觀鎖與樂觀鎖

悲觀鎖與樂觀鎖 悲觀鎖 pessimistic locking 顧名思義就是採用一種悲觀的態度來對待事務併發問題,我們認為系統中的併發更新會非常頻繁,並且事務失敗 了以後重來的開銷很大,這樣以來,我們就需要採用真正意義上的鎖來進行實現。悲觀鎖的基本思想就是每次一 個事務讀取某一條記錄後,就會把這條記...

樂觀鎖與悲觀鎖

悲觀鎖 pessimistic locking 顧名思義就是採用一種悲觀的態度來對待事務併發問題,我們認為系統中的併發更新會非常頻繁,並且事務失敗了以後重來的開銷很大,這樣以來,我們就需要採用真正意義上的鎖來進行實現。悲觀鎖的基本思想就是每次乙個事務讀取某一條記錄後,就會把這條記錄鎖住,這樣 其它的...

樂觀鎖與悲觀鎖

鎖 locking 這個概念在我們學習多執行緒的時候曾經接觸過,其實這裡的鎖和多執行緒裡面處理併發的鎖是乙個道理,都是暴力的把資源歸為自己所有。這裡我們用到鎖的目的就是通過一些機制來保證一些資料在某個操作過程中不會被外界修改,這樣的機制,在這裡,也就是所謂的 鎖 即給我們選定的目標資料上鎖,使其無法...