亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

Synchronized

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

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

Synchronized的使用方式

主要有3種使用方式:

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

public synchronized void method(){

        // 代碼

}

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

public static synchronized void method(){

        // 代碼

 }

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

synchronized(this){

  //代碼                                  

 }

Synchronized的底層實現(xiàn)

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

1.Java對象頭

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

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

Java對象頭主要包括兩部分數(shù)據(jù):

1)類型指針(Klass Pointer)

是對象指向它的類元數(shù)據(jù)的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例;

2)標記字段(Mark Word)

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

所以,很明顯synchronized使用的鎖對象是存儲在Java對象頭里的標記字段里。

2.Monitor

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

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

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

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

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

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

Synchronized 的鎖升級

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

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

1.無鎖

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

2.偏向鎖

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

偏向鎖是指一段同步代碼一直被一個線程所訪問,那么該線程會自動獲取鎖,降低獲取鎖的代價。

3.輕量級鎖

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

4.重量級鎖

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

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

相關(guān)文章

  • Java結(jié)合JS實現(xiàn)URL編碼與解碼

    Java結(jié)合JS實現(xiàn)URL編碼與解碼

    這篇文章介紹了Java結(jié)合JS實現(xiàn)URL編碼與解碼的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • java  HashMap和HashTable的區(qū)別詳解

    java HashMap和HashTable的區(qū)別詳解

    這篇文章主要介紹了java HashMap和HashTable的區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Java Comparator比較器實例解析

    Java Comparator比較器實例解析

    這篇文章主要介紹了Java Comparator比較器實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • 一步步教你寫一個SpringMVC框架

    一步步教你寫一個SpringMVC框架

    現(xiàn)在主流的Web MVC框架除了Struts這個主力外,其次就是Spring MVC了,因此這也是作為一名程序員需要掌握的主流框架,這篇文章主要給大家介紹了關(guān)于如何一步步寫一個SpringMVC框架的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之棧和隊列

    Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之棧和隊列

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之棧和隊列,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-05-05
  • Java多線程揭秘之synchronized工作原理

    Java多線程揭秘之synchronized工作原理

    synchronized算是多線程中非常常用的加鎖方式了,但很多人都不太理解其底層的工作原理。本篇文章博主用盡可能通俗易懂的方式來帶大家去看看synchronized究竟是怎么加鎖的
    2021-10-10
  • Java JDBC基本使用方法詳解

    Java JDBC基本使用方法詳解

    這篇文章主要介紹了Java JDBC基本使用方法,結(jié)合實例形式詳細分析了java JDBC基本原理、用法及操作注意事項,需要的朋友可以參考下
    2020-04-04
  • SpringBoot整合redis+Aop防止重復(fù)提交的實現(xiàn)

    SpringBoot整合redis+Aop防止重復(fù)提交的實現(xiàn)

    Spring Boot通過AOP可以實現(xiàn)防止表單重復(fù)提交,本文主要介紹了SpringBoot整合redis+Aop防止重復(fù)提交的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java中的運算符你知道多少

    Java中的運算符你知道多少

    這篇文章主要為大家詳細介紹了Java中的運算符,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 基于Spring Boot應(yīng)用ApplicationEvent案例場景

    基于Spring Boot應(yīng)用ApplicationEvent案例場景

    這篇文章主要介紹了基于Spring Boot應(yīng)用ApplicationEvent,利用Spring的機制發(fā)布ApplicationEvent和監(jiān)聽ApplicationEvent,需要的朋友可以參考下
    2023-03-03

最新評論