Java知識分享網 - 輕松學習從此開始!????

Java知識分享網

Java1234官方群25:java1234官方群25
Java1234官方群25:838462530
        

實戰springboot+CAS單點登錄課程(免費領取)

SpringBoot打造全棧在線教育平臺實戰課程

畢設代做論文包查重聯系人QQ:1982956321畢設大神 畢設代做論文包查重

66套java實戰課程無套路領取

Java1234 VIP課程

領取微信掃碼登錄Java實現視頻教程

Java1234至尊VIP(特價活動)
當前位置: 主頁 > Java文檔 > Java基礎相關 >

Synchronized_鎖升級 PDF 下載


分享到:
時間:2020-11-19 10:27來源:http://www.nukdnfhq.buzz 作者:轉載  侵權舉報
Synchronized_鎖升級 PDF 下載
失效鏈接處理
Synchronized_鎖升級  PDF 下載


本站整理下載:
提取碼:0vt4 
 
 
相關截圖:
 
主要內容:


三、鎖的優化
1、鎖升級
鎖的4中狀態:無鎖狀態、偏向鎖狀態、輕量級鎖狀態、重量級鎖狀態(級別從低到高)
(1)偏向鎖:
為什么要引入偏向鎖?
因為經過HotSpot的作者大量的研究發現,大多數時候是不存在鎖競爭的,常常是一個
線程多次獲得同一個鎖,因此如果每次都要競爭鎖會增大很多沒有必要付出的代價,為了
降低獲取鎖的代價,才引入的偏向鎖。
偏向鎖的升級
當線程1訪問代碼塊并獲取鎖對象時,會在java對象頭和棧幀中記錄偏向的鎖的
threadID,因為偏向鎖不會主動釋放鎖,因此以后線程1再次獲取鎖的時候,需要比較當
前線程的threadID和Java對象頭中的threadID是否一致,如果一致(還是線程1獲取鎖
對象),則無需使用CAS來加鎖、解鎖;如果不一致(其他線程,如線程2要競爭鎖對
象,而偏向鎖不會主動釋放因此還是存儲的線程1的threadID),那么需要查看Java對象
頭中記錄的線程1是否存活,如果沒有存活,那么鎖對象被重置為無鎖狀態,其它線程
(線程2)可以競爭將其設置為偏向鎖;如果存活,那么立刻查找該線程(線程1)的棧
幀信息,如果還是需要繼續持有這個鎖對象,那么暫停當前線程1,撤銷偏向鎖,升級為
輕量級鎖,如果線程1 不再使用該鎖對象,那么將鎖對象狀態設為無鎖狀態,重新偏向新
的線程。
偏向鎖的取消:
偏向鎖是默認開啟的,而且開始時間一般是比應用程序啟動慢幾秒,如果不想有這個延
遲,那么可以使用-XX:BiasedLockingStartUpDelay=0;
如果不想要偏向鎖,那么可以通過-XX:-UseBiasedLocking = false來設置;
(2)輕量級鎖
為什么要引入輕量級鎖?
輕量級鎖考慮的是競爭鎖對象的線程不多,而且線程持有鎖的時間也不長的情景。因為阻
塞線程需要CPU從用戶態轉到內核態,代價較大,如果剛剛阻塞不久這個鎖就被釋放
了,那這個代價就有點得不償失了,因此這個時候就干脆不阻塞這個線程,讓它自旋這等
待鎖釋放。
輕量級鎖什么時候升級為重量級鎖?
線程1獲取輕量級鎖時會先把鎖對象的對象頭MarkWord復制一份到線程1的棧幀中創建
的用于存儲鎖記錄的空間(稱為DisplacedMarkWord),然后使用CAS把對象頭中的內
容替換為線程1存儲的鎖記錄(DisplacedMarkWord)的地址;
如果在線程1復制對象頭的同時(在線程1CAS之前),線程2也準備獲取鎖,復制了對象
頭到線程2的鎖記錄空間中,但是在線程2CAS的時候,發現線程1已經把對象頭換了,線
程2的CAS失敗,那么線程2就嘗試使用自旋鎖來等待線程1釋放鎖。
但是如果自旋的時間太長也不行,因為自旋是要消耗CPU的,因此自旋的次數是有限制
的,比如10次或者100次,如果自旋次數到了線程1還沒有釋放鎖,或者線程1還在執
行,線程2還在自旋等待,這時又有一個線程3過來競爭這個鎖對象,那么這個時候輕量
級鎖就會膨脹為重量級鎖。重量級鎖把除了擁有鎖的線程都阻塞,防止CPU空轉。


 
 
------分隔線----------------------------
鋒哥公眾號


鋒哥微信


關注公眾號
【Java資料站】
回復 666
獲取 
66套java
從菜雞到大神
項目實戰課程
山东麻将怎么开牌 3067678449820310931541898128851545329940870161398580586353107387575198373443539215995500794628199 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();