最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java?Synchronized的實(shí)現(xiàn)原理

 更新時(shí)間:2022年09月30日 14:23:21   作者:mikechen  
談到多線程就不得不談到Synchronized,重要性不言而喻,今天主要談?wù)凷ynchronized的實(shí)現(xiàn)原理。文中的示例代碼講解詳細(xì),感興趣的可以了解一下

談到多線程就不得不談到Synchronized,重要性不言而喻,今天主要談?wù)凷ynchronized的實(shí)現(xiàn)原理。

Synchronized

synchronized關(guān)鍵字解決的是多個(gè)線程之間訪問(wèn)資源的同步性,synchronized 翻譯為中文的意思是同步,也稱之為”同步鎖“。

synchronized的作用是保證在同一時(shí)刻, 被修飾的代碼塊或方法只會(huì)有一個(gè)線程執(zhí)行,以達(dá)到保證并發(fā)安全的效果。

Synchronized的使用方式

主要有3種使用方式:

1.修飾實(shí)例方法:作用于當(dāng)前實(shí)例加鎖

public synchronized void method(){

        // 代碼

}

2.修飾靜態(tài)方法:作用于當(dāng)前類對(duì)象加鎖

public static synchronized void method(){

        // 代碼

 }

3.修飾代碼塊:指定加鎖對(duì)象,對(duì)給定對(duì)象加鎖

synchronized(this){

  //代碼                                  

 }

Synchronized的底層實(shí)現(xiàn)

synchronized的底層實(shí)現(xiàn)是完全依賴JVM虛擬機(jī)的,所以談synchronized的底層實(shí)現(xiàn),就不得不談數(shù)據(jù)在JVM內(nèi)存的存儲(chǔ):Java對(duì)象頭,以及Monitor對(duì)象監(jiān)視器。

1.Java對(duì)象頭

在JVM虛擬機(jī)中,對(duì)象在內(nèi)存中的存儲(chǔ)布局,可以分為三個(gè)區(qū)域:

  • 對(duì)象頭(Header)
  • 實(shí)例數(shù)據(jù)(Instance Data)
  • 對(duì)齊填充(Padding)

Java對(duì)象頭主要包括兩部分?jǐn)?shù)據(jù):

1)類型指針(Klass Pointer)

是對(duì)象指向它的類元數(shù)據(jù)的指針,虛擬機(jī)通過(guò)這個(gè)指針來(lái)確定這個(gè)對(duì)象是哪個(gè)類的實(shí)例;

2)標(biāo)記字段(Mark Word)

用于存儲(chǔ)對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù),如哈希碼(HashCode)、GC分代年齡、鎖狀態(tài)標(biāo)志、線程持有的鎖、偏向線程 ID、偏向時(shí)間戳等等,它是實(shí)現(xiàn)輕量級(jí)鎖和偏向鎖的關(guān)鍵.

所以,很明顯synchronized使用的鎖對(duì)象是存儲(chǔ)在Java對(duì)象頭里的標(biāo)記字段里。

2.Monitor

monitor描述為對(duì)象監(jiān)視器,可以類比為一個(gè)特殊的房間,這個(gè)房間中有一些被保護(hù)的數(shù)據(jù),monitor保證每次只能有一個(gè)線程能進(jìn)入這個(gè)房間進(jìn)行訪問(wèn)被保護(hù)的數(shù)據(jù),進(jìn)入房間即為持有monitor,退出房間即為釋放monitor。

上圖是syncrhoized同步代碼塊反編譯截圖,可以很清楚的看見(jiàn),主要就是通過(guò)鎖對(duì)象的monitor的取用(monitorenter)與釋放來(lái)(monitorexit)實(shí)現(xiàn)的。

3.線程狀態(tài)流轉(zhuǎn)在Monitor上體現(xiàn)

當(dāng)多個(gè)線程同時(shí)請(qǐng)求某個(gè)對(duì)象監(jiān)視器時(shí),對(duì)象監(jiān)視器會(huì)設(shè)置幾種狀態(tài)用來(lái)區(qū)分請(qǐng)求的線程:

  • Contention List:所有請(qǐng)求鎖的線程將被首先放置到該競(jìng)爭(zhēng)隊(duì)列
  • Entry List:Contention List中那些有資格成為候選人的線程被移到Entry List
  • Wait Set:那些調(diào)用wait方法被阻塞的線程被放置到Wait Set
  • OnDeck:任何時(shí)刻最多只能有一個(gè)線程正在競(jìng)爭(zhēng)鎖,該線程稱為OnDeck
  • Owner:獲得鎖的線程稱為Owner
  • !Owner:釋放鎖的線程

下圖反映了個(gè)狀態(tài)轉(zhuǎn)換關(guān)系:

Synchronized 的鎖升級(jí)

鎖解決了數(shù)據(jù)的安全性,但是同樣帶來(lái)了性能的下降,hotspot 虛擬機(jī)的作者經(jīng)過(guò)調(diào)查發(fā)現(xiàn),大部分情況下,加鎖的代碼不僅僅不存在多線程競(jìng)爭(zhēng),而且總是由同一個(gè)線程多次獲得。

所以基于這樣一個(gè)概率,synchronized 在JDK1.6 之后做了一些優(yōu)化,為了減少獲得鎖和釋放鎖來(lái)的性能開(kāi)銷,引入了偏向鎖,鎖的狀態(tài)根據(jù)競(jìng)爭(zhēng)激烈的程度從低到高不斷升級(jí)。

1.無(wú)鎖

無(wú)鎖沒(méi)有對(duì)資源進(jìn)行鎖定,所有的線程都能訪問(wèn)并修改同一個(gè)資源,但同時(shí)只有一個(gè)線程能修改成功。

2.偏向鎖

偏向鎖是JDK6中引入的一項(xiàng)鎖優(yōu)化,大多數(shù)情況下,鎖不僅不存在多線程競(jìng)爭(zhēng),而且總是由同一線程多次獲得,為了讓線程獲得鎖的代價(jià)更低而引入了偏向鎖。

偏向鎖是指一段同步代碼一直被一個(gè)線程所訪問(wèn),那么該線程會(huì)自動(dòng)獲取鎖,降低獲取鎖的代價(jià)。

3.輕量級(jí)鎖

是指當(dāng)鎖是偏向鎖的時(shí)候,被另外的線程所訪問(wèn),偏向鎖就會(huì)升級(jí)為輕量級(jí)鎖,其他線程會(huì)通過(guò)自旋的形式嘗試獲取鎖,不會(huì)阻塞,從而提高性能。

4.重量級(jí)鎖

指的是原始的Synchronized的實(shí)現(xiàn),重量級(jí)鎖的特點(diǎn):其他線程試圖獲取鎖時(shí),都會(huì)被阻塞,只有持有鎖的線程釋放鎖之后才會(huì)喚醒這些線程。

到此這篇關(guān)于詳解Java Synchronized的實(shí)現(xiàn)原理的文章就介紹到這了,更多相關(guān)Java Synchronized內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

大厂| 上虞市| 剑川县| 湘潭县| 桑植县| 望江县| 英山县| 高阳县| 东明县| 乃东县| 城市| 中宁县| 凌海市| 绥宁县| 凤翔县| 永清县| 剑阁县| 鞍山市| 平度市| 寿阳县| 湘阴县| 台安县| 文山县| 海口市| 东平县| 新安县| 都兰县| 德格县| 广丰县| 云龙县| 盐山县| 平江县| 莱芜市| 乌兰察布市| 漳州市| 邮箱| 梁平县| 察雅县| 顺昌县| 潜江市| 天门市|