91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java鎖的升級策略是什么

發布時間:2021-11-19 16:59:24 來源:億速云 閱讀:158 作者:iii 欄目:編程語言

本篇內容主要講解“Java鎖的升級策略是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java鎖的升級策略是什么”吧!

這三種鎖是指鎖的狀態,并且是專門針對Synchronized關鍵字。JDK 1.6 為了減少"重量級鎖"的性能消耗,引入了“偏向鎖”和“輕量級鎖”,鎖一共擁有4種狀態:無鎖狀態、偏向鎖、輕量級鎖、重量級鎖。鎖狀態是通過對象頭的Mark Word來進行標記的:

鎖可以升級但不能降級,意味著偏向鎖升級成輕量級鎖后不能降級成偏向鎖,這種鎖升級卻不能降級的策略,是為了提高獲得鎖和釋放鎖的效率

重量級鎖:依賴于底層操作系統的Mutex Lock,線程會被阻塞住

缺點:加鎖和解鎖需要從用戶態切換到內核態,性能消耗較大

輕量級鎖:基于重量級鎖進行了優化(避免上下文切換,提高了性能),它假設多線程競爭是互相錯開的,不會發生線程阻塞,呢么上下文切換就是多余的

第一個特點:采用了CAS操作加鎖和解鎖,由于輕量級鎖的鎖記錄(Lock Record)是存放在對象頭和線程空間里的,因此加鎖和解鎖不需要上下文切換,性能消耗較小

第二個特點:一旦發生多線程競爭,首先基于“自旋鎖”思想,自旋CPU循環等待一段時間,不會發生上下文切換,如果還是無法獲得鎖,就將鎖升級為重量級鎖

偏向鎖:基于輕量級鎖進行了優化(減少多次的加鎖和解鎖,提高了性能),它假設整個過程只有一個線程獲得鎖,呢么多次的加鎖和解鎖就是多余的

特點:在第一次獲得鎖之后不會釋放鎖,它會一直持有鎖,后續進入鎖時只需檢查一下鎖狀態和偏向線程ID是否為自己,從而省去了多次的加鎖和解鎖

1.偏向鎖

獲取鎖:

檢測對象頭的Mark Word是否為可偏向狀態(即是否為偏向鎖1,鎖標志位是否為01),如果不是,嘗試競爭鎖:嘗試CAS操作將Mark Word的線程ID設置為當前線程ID,以表示線程獲得鎖,如果失敗說明鎖已被占用

若為可偏向狀態,則檢查線程ID是否為當前線程ID,如果是則表示當前線程已經持有鎖(鎖的可重入),否則說明鎖已被占用

如果鎖已被占用,只能撤銷偏向鎖為無鎖狀態或輕量級鎖

釋放鎖:(偏向鎖使用了一種等到競爭出現才釋放鎖的機制,線程是不會主動釋放偏向鎖的,只有當其他線程競爭偏向鎖時,持有偏向鎖的線程才會釋放鎖)

偏向鎖的撤銷需要等待全局安全點(在這個時間點沒有正在執行的字節碼),暫停擁有偏向鎖的線程,檢查持有偏向鎖的線程是否還活著

如果線程掛了,則將對象頭設置成無鎖狀態;如果線程仍然活著,則將對象頭設置為輕量級鎖(鎖的升級),最終輕量級鎖一定會被釋放

2.輕量級鎖

獲取鎖:

檢測對象頭的Mark Word是否為輕量級鎖(鎖標志位為00),如果不是,嘗試競爭鎖:JVM首先在當前線程的棧幀中建立一個鎖記錄(Lock Record),用于備份存儲對象頭的Mark Word(官方把這份拷貝加了一個Displaced前綴,稱為Displaced Mark Word),然后JVM嘗試CAS操作將Mark Word更新為指向Lock Record的指針,以表示線程獲得鎖,如果失敗說明鎖已被占用

若為輕量級鎖,判斷對象頭的Mark Word是否指向當前線程的棧幀的Lock Record,如果是則表示當前線程已經持有鎖(鎖的可重入),否則說明鎖已被占用

如果鎖已被占用,當前線程便嘗試自旋CPU來獲取鎖,自旋一定次數后輕量級鎖會膨脹為重量級鎖(鎖標志位變成10),線程進入阻塞

釋放鎖:

嘗試CAS操作將Displaced Mark Word中替換回對象頭,如果成功,說明輕量級鎖釋放成功

如果CAS操作失敗,說明存在鎖競爭,鎖已經膨脹成重量級鎖,需要在釋放鎖的同時喚醒那些被掛起的線程

3.重量級鎖

重量級鎖依賴于底層操作系統的Mutex Lock,所有線程都會被阻塞住,線程之間的切換需要從用戶態到內核態,切換成本非常高。

總結:鎖的優缺點對比

偏向鎖(Biased Lock)      加鎖和解鎖不需要額外的消耗,和執行非同步方法相比僅存在納秒級的差距      如果線程間存在鎖競爭,會帶來額外的鎖撤銷      適用于只有一個線程訪問              輕量級鎖(Lightweight Lock)      競爭的線程不會阻塞,提高了程序的響應速度      對于得不到鎖的線程,自旋會消耗CPU      追求響應時間,或者要求臨界區簡短,自旋不會占用CPU過久              重量級鎖(Heavyweight Lock)      線程競爭不使用自旋,不會消耗CPU資源      線程阻塞,響應時間緩慢      追求吞吐量

到此,相信大家對“Java鎖的升級策略是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

明水县| 辽阳市| 武胜县| 汉中市| 集贤县| 阳西县| 保靖县| 元江| 辽源市| 鸡西市| 宁德市| 南靖县| 商城县| 郑州市| 衡阳县| 嵊州市| 白城市| 乌苏市| 邵东县| 怀柔区| 普宁市| 喀喇| 汝城县| 通渭县| 承德市| 利津县| 和政县| 孟连| 泊头市| 桦川县| 兴山县| 大悟县| 资中县| 凯里市| 剑阁县| 偃师市| 长葛市| 兴隆县| 玉溪市| 巫溪县| 浦城县|