Java併發編程之悲觀、樂觀、公平、非公平鎖

一般的情況下只有做寫的時候纔會上鎖。
寫: update del insert
查:select
在這裏插入圖片描述

悲觀鎖:

就是比較悲觀,每次在在執行我們同步代碼塊的時候都會獲取鎖,如果沒有獲取到鎖的情況下,當前線程會被變爲阻塞狀態,效率比較低。
阻塞→就緒

Mysql中行鎖概念

在mysql中多個線程對同一行數據做寫的操作的時候,默認會觸發的行鎖的機制,最終只有一個線程才能對該行數據做寫的操作.
其他的線程會被等待。

悲觀鎖應用場景:

synchronized
mysql 中的行鎖機制
Lock鎖。

事務原理

Beign—觸發行鎖機制獲取鎖的權限
Comnit/ rollback—釋放鎖
在這裏插入圖片描述

commit前:

在這裏插入圖片描述在這裏插入圖片描述

commit後:

在這裏插入圖片描述
數據庫查詢不到 行鎖狀態,因爲已經釋放
在這裏插入圖片描述

Commit—數據提交到數據庫中同時釋放鎖
Rollback—回滾數據,同時釋放鎖

沒有commit

第一次運行正常,但是因爲沒有釋放鎖,第二次運行會 獲取鎖超時
在這裏插入圖片描述
在這裏插入圖片描述

如何查看mysql中行鎖?

select * from information schema. innodb_ trx t

在這裏插入圖片描述在這裏插入圖片描述

樂觀鎖機制:

樂觀鎖比較樂觀,做寫的操作沒有鎖概念,也就是不會導致我們程序阻塞。
底層通過版本號碼或者閾值的形式比較CAS、自旋

在這裏插入圖片描述
優點:效率比較高 沒有阻塞概念 無鎖機制
缺點:通過死循環控制非常消耗服務器內存

在這裏插入圖片描述
在這裏插入圖片描述

共享鎖與獨佔鎖

獨佔鎖:

多個線程中最終只有一一個線程持有鎖。

共享鎖:

多個線程可以共同一-把鎖lock 讀寫鎖
兩個線程同時讀的

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