日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM系列之:对象的锁状态和同步

發布時間:2024/2/28 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM系列之:对象的锁状态和同步 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • java對象頭
  • java中鎖狀態的變化
  • 偏向鎖biased locking
  • 輕量級鎖thin lock
  • 重量級鎖
  • 三種鎖狀態的不同

簡介

鎖和同步是java多線程編程中非常常見的使用場景。為了鎖定多線程共享的對象,Java需要提供一定的機制來實現共享對象的鎖定,從而保證一次只有一個線程能夠作用于共享對象。當第二個線程進入同一個區域的時候,必須等待第一個線程解鎖該對象。

JVM是怎么做到的呢?為了實現這個功能,java對象又需要具備什么樣的結構呢?快來一起看看吧。

java對象頭

Java的鎖狀態其實可以分為三種,分別是偏向鎖,輕量級鎖和重量級鎖。

在Java HotSpot VM中,每個對象前面都有一個class指針和一個Mark Word。 Mark Word存儲了哈希值以及分代年齡和標記位等,通過這些值的變化,JVM可以實現對java對象的不同程度的鎖定。

還記得我們之前分享java對象的那張圖嗎?

javaObject對象的對象頭大小根據你使用的是32位還是64位的虛擬機的不同,稍有變化。這里我們使用的是64位的虛擬機為例。

Object的對象頭,分為兩部分,第一部分是Mark Word,用來存儲對象的運行時數據比如:hashcode,GC分代年齡,鎖狀態,持有鎖信息,偏向鎖的thread ID等等。

在64位的虛擬機中,Mark Word是64bits,如果是在32位的虛擬機中Mark Word是32bits。

第二部分就是Klass Word,Klass Word是一個類型指針,指向class的元數據,JVM通過Klass Word來判斷該對象是哪個class的實例。

我們可以看到對象頭中的Mark Word根據狀態的不同,存儲的是不同的內容。

其中鎖標記的值分別是:無鎖=001,偏向鎖=101,輕量級鎖=000,重量級鎖=010。

java中鎖狀態的變化

為什么java中的鎖有三種狀態呢?其本質原因是為了提升鎖的效率,因為不同情況下,鎖的力度是不一樣的。

通過設置不同的鎖的狀態,從而可以不同的情況用不同的處理方式。

下圖是java中的鎖狀態的變化圖:

上面的圖基本上列出了java中鎖狀態的整個生命周期。接下來我們一個一個的講解。

偏向鎖biased locking

一般來說,一個對象被一個線程獲得鎖之后,很少發生線程切換的情況。也就是說大部分情況下,一個對象只是被一個對象鎖定的。

那么這個時候我們可以通過設置Mark word的一定結構,減少使用CAS來更新對象頭的頻率。

為了實現這樣的目標,我們看下偏向鎖的Mark word的結構:

當偏向線程第一次進入同步塊的時候,會去判斷偏向鎖的狀態和thread ID,如果偏向鎖狀態是1,并且thread ID是空的話,將會使用CAS命令來更新對象的Mark word。

設置是否偏向鎖=1,鎖標記=01,線程ID設置為當前鎖定該對象的線程。

下一次該對象進入同步塊的時候,會先去判斷鎖定的線程ID和當前線程ID是否相等,如果相等的話則不需要執行CAS命令,直接進入同步塊。

如果這個時候有第二個線程想訪問該對象的同步塊,因為當前對象頭的thread ID是第一個線程的ID,跟第二個線程的ID不同。

如果這個時候線程1的同步塊已經執行完畢,那么需要解除偏向鎖的鎖定。

解除鎖定很簡單,就是將線程ID設置為空,并且將偏向鎖的標志位設為0,

如果這個時候線程1的同步塊還在執行,那么需要將偏向鎖升級為輕量級鎖。

輕量級鎖thin lock

先看下輕量級鎖的結構:

可以看到Mark word中存放的是棧中鎖記錄的指針和鎖的標記=00。

如果對象現在處于未加鎖狀態,當一個線程嘗試進入同步塊的時候,會將把對象頭和當前對象的指針拷貝一份,放在線程的棧中一個叫做lock record的地方。

然后JVM通過CAS操作,將對象頭中的指針指向剛剛拷貝的lock record。如果成功,則該線程擁有該對象的鎖。

實際上Lock Record和Mark word形成了一個互相指向對方的情況。

下次這個線程再次進入同步塊的時候,同樣執行CAS,比較Mark word中的指針是否和當前thread的lock record地址一致,如果一致表明是同一個線程,可以繼續持有該鎖。

如果這個時候有第二個線程,也想進入該對象的同步塊,也會執行CAS操作,很明顯會失敗,因為對象頭中的指針和lock record的地址不一樣。

這個時候第二個線程就會自旋等待。

那么第一個線程什么時候會釋放鎖呢?

輕量級鎖在線程退出同步塊的時候,同樣需要執行CAS命令,將鎖標記從00替換成01,也就是無鎖狀態。

重量級鎖

如果第二個線程自旋時間太久,就會將鎖標記替換成10(重量級鎖),并且設置重量級鎖的指針,指向第二個線程,然后進入阻塞狀態。

當第一個線程退出同步塊的時候,執行CAS命令就會出錯,這時候第一個線程就知道鎖已經膨脹成為重量級鎖了。

第一個線程就會釋放鎖,并且喚醒等待的第二個線程。

第二個線程被喚醒之后,重新爭奪鎖。

我們看下重量級鎖的結構:

三種鎖狀態的不同

偏向鎖,輕量級鎖和重量級鎖到底有什么不同了?

這里總結一下,偏向鎖下次進入的時候不需要執行CAS命令,只做線程ID的比較即可。

輕量級鎖進入和退出同步塊都需要執行CAS命令,但是輕量級鎖不會阻塞,它使用的是自旋命令來獲取鎖。

重量級鎖不使用自旋,但是會阻塞線程。

好了,小伙伴們對于鎖的狀態變化有什么疑問嗎?歡迎留言。

本文作者:flydean程序那些事

本文鏈接:http://www.flydean.com/jvm-object-lock-synchronization/

本文來源:flydean的博客

歡迎關注我的公眾號:程序那些事,更多精彩等著您!

總結

以上是生活随笔為你收集整理的JVM系列之:对象的锁状态和同步的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美女娇喘 | 黄色片毛片 | 污污的网站在线免费观看 | 日韩精品一区二区不卡 | 最新啪啪网站 | 亚洲区一区 | 致命魔术电影高清在线观看 | free性m.freesex欧美 | 亚洲国产精品一 | 91成人福利在线 | 综合久久综合 | 在线天堂6 | 一区二区三区 日韩 | 国产亚洲欧美精品久久久久久 | 国产精品自拍一区 | 老司机成人免费视频 | 日本黄色xxxxx | 日韩精品一区二区电影 | 色婷婷色婷婷 | 亚洲美女屁股眼交 | 日本乱偷人妻中文字幕在线 | 手机看片久久久 | 色图社区 | 国产伦理吴梦梦伦理 | 伊人久色| а√天堂资源官网在线资源 | 黑人激情视频 | 日本视频网站在线观看 | 国产成人无码精品久久久性色 | 精品成人无码一区二区三区 | 麻豆国产原创 | 欧美丰满熟妇bbbbbb | www.免费av| wwwxx欧美| 亚洲吧| 春色影视 | 91成人在线观看喷潮 | 精品一区二区亚洲 | 日韩制服诱惑 | 欧美在线视频精品 | 最新中文字幕在线观看视频 | 风间由美一区二区 | 中文字幕日韩亚洲 | 久久久青| 欧美成人播放 | 久久精选视频 | aaa特级毛片 | 一级看片免费视频 | 中文字幕第315页 | 久久夜色精品国产噜噜亚洲av | 色999日韩 | 99视频在线观看视频 | 丰满人妻综合一区二区三区 | 天天视频入口 | 99视频只有精品 | 国产激情一区 | 深夜福利影院 | 日韩三级免费看 | a级片免费视频 | 国产乱码精品一区二区三区不卡 | 日韩少妇视频 | 久久久久久久久久久久久久久久久 | www插插插| 日韩成人精品视频 | 成人高潮片免费 | 中文字幕在线免费视频 | 99久久久久无码国产精品 | 91精品视频观看 | 名校风暴在线观看免费高清完整 | 综合激情视频 | 欧美精品一区二区三区在线播放 | 男女裸体影院高潮 | 6680新视觉电影免费观看 | 久久久在线 | 天堂在线视频观看 | 一级特黄色片 | 国产伦精品一区二区三区视频黑人 | 亚洲xx网站| 欧美色图亚洲自拍 | 人妖天堂狠狠ts人妖天堂狠狠 | 日韩高清一区二区 | 国产乱码精品一区二区三区五月婷 | 手机av片| 国产最爽的乱淫视频国语对白 | 午夜电影天堂 | 久久色av | 成人久久视频 | 六月色婷| 国产依人| 182在线视频 | 99re在线视频精品 | 午夜插插 | 狠狠干精品 | 中文字幕人妻丝袜二区 | 麻豆电影网站 | 亚洲一区二区在线 | 久久sp| 亚洲精品免费网站 | 欧美xxxx888 |