Java之樂觀鎖和悲觀鎖

Java之樂觀鎖和悲觀鎖

 

樂觀鎖

用到的機制是CAS(Compare and Swap),每個線程都可以訪問,只有在提交數據的時候,檢查是否違反了數據的完整性。如果發生衝突失敗重試,直到成功爲止。樂觀鎖大多數都是基於數據版本(version)記錄機制來實現的。何爲數據版本?我們通常情況下會在數據庫中添加一個版本(version)標識。讀取數據時,也會將這個版本標識讀取到,事務完成後版本號加一。提交數據時當前版本號會與數據庫中的版本進行比較,如果當前版本號大於數據庫中的版本號,則給予更新。負責認爲過期數據,會重新開始。

舉個例子:

在一張數據表中賬戶信息中有一個version字段,當前值爲1。此時賬戶信息中還有一個餘額字段,當前值100。

A用戶此時將數據讀取出來此時version = 1,消費50

B用戶也將數據讀取出來此時version = 1,消費10

A完成操作過程中會將版本號version加一,此時version = 2,提交數據,2 > 1 則提交成功。數據庫中的版本號更新爲2

B完成操作版本號也加一version = 2,提交數據,2 > 2?則數據提交失敗,需要重新開始。

悲觀鎖

悲觀鎖:使用synchronized來解決多線程併發問題,以保證事務的完整性。線程在訪問加鎖的代碼塊,只會讓一個線程進入,其他線程只能等待或者去執行其他沒有加鎖的代碼塊。這個線程執行完成會釋放鎖,由下一個線程來執行。性能慢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章