悲觀鎖和樂觀鎖

2021-10-02 01:10:28 字數 849 閱讀 6283

悲觀鎖總是假設最壞的情況,每次去拿資料的時候認為別人都會修改資料,所以每次拿資料的時候都會上鎖。關係型資料庫經常會用到,比如表鎖和行鎖。

代表就是synchronized和reentrantlock,經常用於多寫場景。

樂觀鎖總是假設最好的情況,每次去拿資料的時候都認為別人不會更改資料,所以不會上鎖。但是在更新的時候會判斷一下在此期間別人有沒有更改資料。

樂觀鎖常用於多讀場景衝突發生少,省去了鎖的開銷,提高了整個系統的吞吐量。若是多寫場景會發生較多衝突,系統就會不停retry,會降低系統的效率。

樂觀鎖常見的兩種方法:

樂觀鎖的缺點:

aba問題。

如果乙個變數v初次讀取的時候是a值,再次讀取準備賦值的時候仍然是a值。但不能保證沒有被其他執行緒修改過值,因為可能修改又改回a,cas會誤認為它從未被修改過。

解決方法:

atomicstamreference類的compareandset方法。

當前引用是否是預期引用,當前標誌是否是預期標誌,若全部相等更新值。

迴圈開銷大

cas或版本號一直沒有成功,會自旋重試,cpu執行開銷非常大。

解決方法:

pause指令有一定的提公升。

1、延遲流水線執行命令(de-pipeline)。

2、可避免在退出迴圈的時候因記憶體順序衝突引起cpu流水線被清空,提高cpu執行效率。

只能保證乙個共享變數的原子操作。

解決辦法:

atomicreference類可以將多個變數放在乙個物件裡進行cas操作。

悲觀鎖和樂觀鎖

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

悲觀鎖和樂觀鎖

前幾天有人問了我乙個問題,說如果資料庫某些操作不用事務,那麼又需要保持資料的一致性,那麼該用什麼方法替代事務。我就想到了悲觀鎖和樂觀鎖的思想,下面我解釋一下在資料庫中的悲觀鎖和樂觀鎖 1.悲觀鎖就是把資料庫的一些操作,放在事務當中,依賴資料庫的隔離級別,實現對資料修改的封鎖,這樣做資料一致性可以保持...

悲觀鎖和樂觀鎖

悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...