- 🎥?個人主頁:Dikz12
- 📕格言:那些在暗處執拗生長的花,終有一日會馥郁傳香
- 歡迎大家👍點贊?評論?收藏
目錄
常見鎖策略?
?樂觀鎖和悲觀鎖
輕量級鎖和重量級鎖
自旋鎖和掛起等待鎖
?讀寫鎖
公平鎖和非公平鎖
CAS?
??編輯
?ABA問題
synchronized原理
synchronozed,屬于哪種鎖?
鎖升級
?鎖消除
鎖粗化?
常見鎖策略?
?樂觀鎖和悲觀鎖
?這是"鎖的一種特性",并不是一把具體的鎖!樂觀,悲觀是對后續鎖沖突是否激烈給出的預測.
樂觀鎖: 如果預測接下來的鎖沖突的概率不大,就可以少做一些事情,就稱為"樂觀鎖".
悲觀鎖:?如果預測接下來的鎖沖突的概率很大,就要多做一些事情,就稱為"悲觀鎖".
輕量級鎖和重量級鎖
?輕量級鎖: 鎖的開銷比較小.
重量級鎖: 鎖的開銷比較大.
樂觀鎖,通常是可以看作輕量級鎖? ? 悲觀鎖,通常可以看作重量級鎖.(也是存在特殊情況的)
一個是預測鎖沖突的概率,一個是實際消耗的開銷.
自旋鎖和掛起等待鎖
?自旋鎖,就是一種輕量級鎖的典型實現.
比如: 使用一個while循環,不停的檢查當前鎖是否釋放,如果沒有釋放,就繼續循環,釋放了獲取鎖,從而結束循環.(忙等,消耗cpu換來了更快的響應速度).
掛起等待鎖: 就屬于重量級鎖的一種典型實現.
要借助系統api來實現,一旦出現鎖競爭,就會在內核中觸發一系列的動作.(比如讓這個線程進入阻塞狀態,暫時不參與cpu調度).
?讀寫鎖
這里的讀寫鎖跟前面"事務"里的給讀加鎖 和 給寫加鎖 不是一樣的概念.
速寫鎖,是加鎖操作,分成讀鎖 和寫鎖.
兩個線程加鎖過程中:
1:?讀鎖和讀鎖之間,不會產生競爭.
2.讀鎖和寫鎖之間,會有競爭.(線程安全問題)
3.寫鎖和寫鎖之間,也會有競爭.
公平鎖和非公平鎖
?
CAS?
Compare and swap?簡稱 CAS. 比較交換的是 內存 和 寄存器.
CAS,就是一個cpu指令,單個的cpu指令,是原子的!就可以使用CAS完成一些操作,進一步替代"加鎖".
也就是基于CAS實現線程安全的方式,也稱為"無鎖編程".
?優點:保證了線程安全,同時避免了阻塞.
?缺點: 1.代碼比較復雜,不好理解
? ? ? ? ? ?2.適合于特定的場景,不如加鎖方式更普適.
?
?原子類里面是基于CAS來實現的!!!
CAS是通過重試的方式,避免穿插; 加鎖則是通過阻塞的方式,避免穿插.
?ABA問題
?CAS 進行操作的關鍵,是通過值"有沒有發生變化" 來作為"沒有其它線程穿插執行"的判斷依據.
在極端情況下,也是會出現問題的.比如: 把值從A- > B ->A,針對第一個線程來說,看起來好像是這個值沒變,實際上已經被穿插執行了.
?解決上訴問題:
只要讓判定的數值,按照一個方向增長即可.? (有增有減,就可能出現ABA)
針對像賬戶余額這樣的操作:
?可以引入一個額外的變量,版本號,約定每次修改余額,都要讓版本號自增.
在使用CAS的時候,就不是直接判定余額,而是判定版本號.
synchronized原理
synchronozed,屬于哪種鎖?
1.對于"樂觀悲觀"是自適應的.
2.對于"輕量和重量"是自適應的.
3.對于"自旋和掛起等待"是自適應的.
4.不是讀寫鎖.
5.是可重入鎖 .
6.是非公平鎖
?
鎖升級
設計JVM的大佬就把synchronized 設置成了 無鎖? 偏向鎖? 輕量級鎖? 重量級鎖 這四種狀態.
?
當你加鎖的時候會先進入偏向鎖的狀態,如果出現"鎖競爭"的可能性就立刻升級成輕量級鎖,?也就是真正意義上的加鎖.
偏向鎖:
?鎖消除
?
鎖粗化?
?synchronized 里頭,代碼越多,就認為鎖的粒度越粗;代碼越少,鎖的粒度越細.
?
粒度細的時候,能夠并發執行的邏輯更多,更有利于充分利用多核cpu資源.
但是,如果粒度細的鎖,被反復加鎖,解鎖可能實際效果還不如粒度粗的鎖. (涉及到鎖競爭問題)
?