Java鎖的四種狀態(無鎖、偏向級鎖、輕量級鎖、重量級鎖)

介紹

首先,我們需要明確一點:偏向級鎖、輕量級鎖、重量級鎖只針對synchronized?

鎖的狀態總共有四種,級別由低到高依次為:無鎖、偏向鎖、輕量級鎖、重量級鎖。

這四種鎖狀態分別代表什么,為什么會有鎖升級?其實在 JDK 1.6之前,synchronized 還是一個重量級鎖,是一個效率比較低下的鎖,但是在JDK 1.6后,Jvm為了提高鎖的獲取與釋放效率對synchronized?進行了優化,引入了?偏向鎖 和 輕量級鎖?,從此以后鎖的狀態就有了四種(無鎖、偏向鎖、輕量級鎖、重量級鎖),并且四種狀態會隨著競爭的情況逐漸升級,而且是不可逆的過程,即不可降級,也就是說只能進行鎖升級(從低級別到高級別),不能鎖降級(高級別到低級別)。這種鎖升級卻不能降級的策略,目的是為了提高獲得鎖和釋放鎖的效率。

?

1.無鎖?

無鎖是指沒有對資源進行鎖定,所有的線程都能訪問并修改同一個資源,但同時只有一個線程能修改成功。

無鎖的特點是修改操作會在循環內進行,線程會不斷的嘗試修改共享資源。如果沒有沖突就修改成功并退出,否則就會繼續循環嘗試。如果有多個線程修改同一個值,必定會有一個線程能修改成功,而其他修改失敗的線程會不斷重試直到修改成功。

?

2.偏向鎖

?顧名思義,偏向某一個線程,當線程數目不多的時候,由于反復獲取鎖會使得我們的運行效率下降,于是出現了偏向級鎖。JVM使用CAS操作把線程ID記錄到對象的Mark Word當中,并修改標識位,name當前線程就擁有了這把鎖。

?

? 偏向級鎖不需要操作系統的介入,JVM使用CAS操作將線程ID放入對象的Mark Word字段中,于是線程獲得了鎖,可以執行synchronized代碼塊的內容,當線程再次執行到這個synchronized的時候,JVM通過鎖對象的Mark Word判斷 :當前線程ID還存在,還持有這個對象的鎖,于是就可以繼續進入臨界區執行,而不需要再次獲得鎖

初次執行到synchronized代碼塊的時候,鎖對象變成偏向鎖(通過CAS修改對象頭里的鎖標志位),字面意思是“偏向于第一個獲得它的線程”的鎖。執行完同步代碼塊后,線程并不會主動釋放偏向鎖。當第二次到達同步代碼塊時,線程會判斷此時持有鎖的線程是否就是自己(持有鎖的線程ID也在對象頭里),如果是則正常往下執行。由于之前沒有釋放鎖,這里也就不需要重新加鎖。如果自始至終使用鎖的線程只有一個,很明顯偏向鎖幾乎沒有額外開銷,性能極高。

偏向鎖只有遇到其他線程嘗試競爭偏向鎖時,持有偏向鎖的線程才會釋放鎖,線程是不會主動釋放偏向鎖的。?

偏向鎖是指當一段同步代碼一直被同一個線程所訪問時,即不存在多個線程的競爭時,那么該線程在后續訪問時便會自動獲得鎖,從而降低獲取鎖帶來的消耗,即提高性能。

?3.輕量級鎖

輕量級鎖是指當鎖是偏向鎖的時候,卻被另外的線程所訪問,此時偏向鎖就會升級為輕量級鎖,其他線程會通過自旋的形式嘗試獲取鎖,線程不會阻塞,從而提高性能。

輕量級鎖的獲取主要由兩種情況:
① 當關閉偏向鎖功能時;
② 由于多個線程競爭偏向鎖導致偏向鎖升級為輕量級鎖。

一旦有第二個線程加入鎖競爭,偏向鎖就升級為輕量級鎖(自旋鎖)。這里要明確一下什么是鎖競爭:如果多個線程輪流獲取一個鎖,但是每次獲取鎖的時候都很順利,沒有發生阻塞,那么就不存在鎖競爭。只有當某線程嘗試獲取鎖的時候,發現該鎖已經被占用,只能等待其釋放,這才發生了鎖競爭。

在輕量級鎖狀態下繼續鎖競爭,沒有搶到鎖的線程將自旋,即不停地循環判斷鎖是否能夠被成功獲取。獲取鎖的操作,其實就是通過CAS修改對象頭里的鎖標志位。先比較當前鎖標志位是否為“釋放”,如果是則將其設置為“鎖定”,比較并設置是原子性發生的。這就算搶到鎖了,然后線程將當前鎖的持有者信息修改為自己。

長時間的自旋操作是非常消耗資源的,一個線程持有鎖,其他線程就只能在原地空耗CPU,執行不了任何有效的任務,這種現象叫做忙等(busy-waiting)。如果多個線程用一個鎖,但是沒有發生鎖競爭,或者發生了很輕微的鎖競爭,那么synchronized就用輕量級鎖,允許短時間的忙等現象。這是一種折衷的想法,短時間的忙等,換取線程在用戶態和內核態之間切換的開銷。

?

?4.重量級鎖?

當多個線程競爭同一個鎖時,會導致除鎖的擁有者外,其余線程都會自旋,這將導致自旋次數過多,cpu效率下降,所以會將鎖升級為重量級鎖。?

重量級鎖顯然,此忙等是有限度的(有個計數器記錄自旋次數,默認允許循環10次,可以通過虛擬機參數更改)。如果鎖競爭情況嚴重,某個達到最大自旋次數的線程,會將輕量級鎖升級為重量級鎖(依然是CAS修改鎖標志位,但不修改持有鎖的線程ID)。當后續線程嘗試獲取鎖時,發現被占用的鎖是重量級鎖,則直接將自己掛起(而不是忙等),等待將來被喚醒。

重量級鎖是指當有一個線程獲取鎖之后,其余所有等待獲取該鎖的線程都會處于阻塞狀態。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24566.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24566.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24566.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在UI界面中實現3d人物展示

簡要原理(設置雙攝像機): 為需要展示的3D人物單獨設置一個攝像機(只設置為渲染人物層級),主要攝像機的方向與人物方向一致,但攝像機需要需要旋轉180,設置的角度自行進行微調創建一個Render Texture類型的組件用于存儲攝像機渲染的內容UI上設置需要展示的圖片區域,圖片…

遍歷目錄

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 遍歷在漢語中的意思是全部走遍,到處周游。在Python中,遍歷是將指定的目錄下的全部目錄(包括子目錄)及…

聰明人社交的基本順序:千萬別搞反了,越早明白越好

聰明人社交的基本順序:千萬別搞反了,越早明白越好 國學文化 德魯克博雅管理 2024-03-27 17:00 作者:方小格 來源:國學文化(gxwh001) 導語 比一個好的圈子更重要的,是自己優質的能力。 唐詩宋…

【重學C語言】十九、SDL2 圖形化編程的使用

【重學C語言】十九、SDL2 圖形化編程的使用 SDL2 的第一個程序渲染器紋理渲染1. 紋理的概念2. 加載紋理3. 渲染紋理4. 紋理設置和查詢5. 紋理渲染流程6. 注意事項SDL2_imageSDL2 的第一個程序 #define SDL_MAIN_HANDLED #include <SDL.h>int main(int argc, char* argv[…

AH股高開低走,創業板跌超2%,寧德時代下挫6%,微盤股指數反彈超5%

創業板跌2%&#xff0c;權重股寧德時代跌近6%&#xff1b;地產、光刻機概念股逆勢大漲&#xff1b;券商股午后集體下跌&#xff0c;天風證券一度跌停。微盤股指數經歷連跌后早盤反彈超5%。 內容提要 周五&#xff0c;A股高開后回落&#xff0c;午盤震蕩回升。截至收盤&#x…

python-Bert(谷歌非官方產品)模型基礎筆記0.1.096

python-bert模型基礎筆記0.1.015 TODOLIST官網中的微調樣例代碼Bert模型的微調限制Bert的適合的場景Bert多語言和中文模型Bert模型兩大類官方建議模型Bert模型中名字的含義Bert模型包含的文件Bert系列模型參數介紹微調與遷移學習區別Bert微調的方式Pre-training和Fine-tuning區…

Python可視化 | 使用matplotlib繪制面積圖示例

面積圖是數據可視化中的一個有效工具&#xff0c;用于說明時間上的關系和趨勢。它們提供了一種全面的、視覺上迷人的方法&#xff0c;通過熟練地將折線圖的可讀性與填充區域的吸引力相結合來呈現數值數據。 在本文中&#xff0c;我們將學習更多關于在Python中創建面積折線圖的…

【python】python指南(二):命令行參數解析器ArgumentParser

一、引言 對于算法工程師來說&#xff0c;語言從來都不是關鍵&#xff0c;關鍵是快速學習以及解決問題的能力。大學的時候參加ACM/ICPC一直使用的是C語言&#xff0c;實習的時候做一個算法策略后臺用的是php&#xff0c;畢業后做策略算法開發&#xff0c;因為要用spark&#x…

24考研408大變化,25考研高分上岸規劃+應對策略

巧了&#xff0c;我有現成的經驗&#xff1a; 數學和專業課的成績都不高不低&#xff0c;剛好夠用&#xff0c;其實408想上岸&#xff0c;不僅僅要學好408&#xff0c;還要學好考研數學&#xff0c;這是我的肺腑之言&#xff0c;我復試的時候&#xff0c;我知道的那些沒有進復試…

高通SDX12:Voice Over USB 功能調試

一、功能概述及使用環境 Linux PC 作為上位機,內置 SLIC基于高通 SDX12 平臺的設備作為從設備,通過USB連接到 Linux PC 上,在 PC 上枚舉 UAC 設備從設備進行 MO/MT Call 時,上位機使用 arecord 進行錄音,音頻數據通過 USB 傳至上位機,上位機停止錄音后再使用 aplay 進行播…

vue element 接口返回數據與控制臺打印數據不一致 踩坑

問題描述&#xff1a; 接口返回數據正常&#xff0c;&#xff0c;控制臺打印不對&#xff0c;element el-switch表格中使用&#xff0c;控制臺打印數據被改變 如下正常數據 數據id 17狀態是0 控制臺打印狀態卻是1 造成原因&#xff1a; element el-seitch組件修改了狀態 修…

解決方案:昇騰aarch64服務器安裝CUDA+GCC+CMake,編譯安裝Pytorch,華為昇騰HPC服務器深度學習環境安裝全流程

目錄 一、安裝CUDA和cudnn1.1、下載CUDA驅動1.2、安裝CUDA驅動1.3、配置環境變量1.4、安裝cudnn1.5、安裝magma-cuda 二、安裝gcc編譯器三、安裝CMake四、安裝NCCL五、編譯安裝Pytorch5.1、前提準備5.2、下載pytorch源碼5.3、配置環境變量5.4、Pytorch編譯安裝5.5、測試Pytorch…

Python教程:Python操作MySQL基礎使用

8、Python操作MySQL基礎使用 8.1 安裝pymysql pip install pymysql8.2 測試連接 測試代碼 from pymysql import Connection# 獲取到MySQL數據庫的鏈接對象 conn Connection(# 主機名hostlocalhost,# 端口號,默認3306port3306,# 賬戶名userroot,# 密碼password3535 )# 打印…

日志分析集群最新版

日志分析集群-8版本 作者&#xff1a;行癲&#xff08;盜版必究&#xff09; 第一部分&#xff1a;Elasticsearch 一&#xff1a;環境準備 1.簡介 ? 部署模式&#xff1a;es集群采用無主模式 ? es版本&#xff1a;8.13.4 ? jdk版本&#xff1a;使用es內嵌的jdk21&#x…

GAT1399協議分析(10)--單圖像刪除

一、官方接口 由于批量刪除的接口&#xff0c;圖像只能單獨刪除。 二、wireshark實例 這個接口比較簡單&#xff0c;調用request delete即可 文本化&#xff1a; DELETE /VIID/Images/34078100001190001002012024060513561300065 HTTP/1.1 Host: 10.0.201.56:31400 User-Age…

【sklearn】【邏輯回歸1】

學習筆記來自&#xff1a; 所用的庫和版本大家參考&#xff1a; Python 3.7.1Scikit-learn 0.20.1 Numpy 1.15.4, Pandas 0.23.4, Matplotlib 3.0.2, SciPy 1.1.0 1 概述 1.1 名為“回歸”的分類器 在過去的四周中&#xff0c;我們接觸了不少帶“回歸”二字的算法&#xf…

生物神經網絡 原理分析研讀02

可能有用基礎介紹 人類交互1 大腦視覺的處理過程 人類交互2 聽覺處理和語言中樞 人類交互3 皮膚感覺與運動系統 人類交互4 感覺輸入和運動輸出 人類交互5 大腦信號編碼與解碼 相關材料分析研讀 當前為了實現人工智能的兩個主流技術是深度學習和類腦計算&#xff0c;深度學習…

linux防止nmap掃描

1、首先關閉Centos7自帶的firewalld [rootnode ~]# systemctl disable firewalld.service && systemctl stop firewalld.service 2、安裝iptables服務 [rootnode ~]# yum install iptables-services iptables-devel -y [rootnode ~]# systemctl enable iptables …

【Vue】練習-Vuex中的值和組件中的input雙向綁定

目標 實時輸入&#xff0c;實時更新&#xff0c;鞏固 mutations 傳參語法 實現步驟 代碼示例 App.vue <input :value"count" input"handleInput" type"text"> <script>export default {methods: {handleInput (e) {// 1. 實時獲取…

MyQL 事務隔離級別解析

隔離級別臟讀不可重復讀幻讀未提交讀可能可能可能已提交讀不可能可能可能可重復讀不可能不可能可能可串行化不可能不可能不可能 當我們談論數據庫事務的隔離級別時&#xff0c;經常會聽到“臟讀”、“不可重復讀”和“幻讀”這三個術語。下面我會盡量用通俗的語言來解釋它們&a…