大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java培訓 Java培訓教程:Java多線程詳解之Synchronized的底層實現

Java培訓教程:Java多線程詳解之Synchronized的底層實現

更新時間:2020-01-02 15:15:54 來源:動力節點 瀏覽2391次


  Java面試的時候經常會被問到Java多線程相關的問題,尤其喜歡問:


  synchronized的底層實現原理


  synchronized鎖與JVM的關系


  synchronized的鎖升級順序


  synchronized的鎖優劣勢與應用場景


  今天主要分享以上內容,詳解synchronized的底層實現。


  Synchronized(同步鎖)


  synchronized 翻譯為中文的意思是同步,也稱之為”同步鎖“。


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


  Synchronized的使用


  1.synchronized的3種使用方式


  修飾實例方法:作用于當前實例加鎖


  修飾靜態方法:作用于當前類對象加鎖


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


  2.synchronized的代碼范例


Java培訓教程:Java多線程詳解之Synchronized的底層實現


  Synchronized的底層實現


  synchronized的底層實現是完全依賴與JVM虛擬機的。


  所以談synchronized的底層實現,就不得不談數據在JVM內存的存儲:Java對象頭,以及Monitor對象監視器。


  1.Java對象頭


  在JVM虛擬機中,對象在內存中的存儲布局,可以分為三個區域:


  對象頭(Header)


  實例數據(Instance Data)


  對齊填充(Padding)


  Java對象頭主要包括兩部分數據:


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


  標記字段(Klass Pointer):用于存儲對象自身的運行時數據,如哈希碼(HashCode)、GC分代年齡、鎖狀態標志、線程持有的鎖、偏向線程 ID、偏向時間戳等等,它是實現輕量級鎖和偏向鎖的關鍵.


  2.Java鎖對象存儲位置


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


  3.Monitor


  synchronized的對象鎖,其指針指向的是一個monitor對象(由C++實現)的起始地址。每個對象實例都會有一個 monitor。


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


  使用syncrhoized加鎖的同步代碼塊在字節碼引擎中執行時,主要就是通過鎖對象的monitor的取用與釋放來實現的。


  4.線程狀態流轉


  當多個線程同時請求某個monitor時,monitor會設置幾種狀態用來區分請求的線程:


  Contention List:所有請求鎖的線程將被首先放置到該競爭隊列


  Entry List:Contention List中那些有資格成為候選人的線程被移到Entry List


  Wait Set:那些調用wait方法被阻塞的線程被放置到Wait Set


  OnDeck:任何時刻最多只能有一個線程正在競爭鎖,該線程稱為OnDeck


  Owner:獲得鎖的線程稱為Owner


  !Owner:釋放鎖的線程


  下圖反映了個狀態轉換關系


Java培訓教程:Java多線程詳解之Synchronized的底層實現


  Synchronized 鎖的升級


  鎖解決了數據的安全性,但是同樣帶來了性能的下降。hotspot 虛擬機的作者經過調查發現,大部分情況下,加鎖的代碼不僅僅不存在多線程競爭,而且總是由同一個線程多次獲得。所以基于這樣一個概率。


  synchronized 在JDK1.6 之后做了一些優化,為了減少獲得鎖和釋放鎖來的性能開銷,引入了偏向鎖、輕量級鎖、自旋鎖、重量級鎖,鎖的狀態根據競爭激烈的程度從低到高不斷升級。


  1.偏向鎖


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


  偏向鎖會偏向于第一個獲得它的線程,如果在接下來的執行過程中,該鎖沒有被其他的線程獲取,則持有偏向鎖的線程將永遠不需要同步。


  2.輕量級鎖


  如果明顯存在其它線程申請鎖,那么偏向鎖將很快升級為輕量級鎖。


  3.自旋鎖


  自旋鎖原理非常簡單,如果持有鎖的線程能在很短時間內釋放鎖資源,那么那些等待競爭鎖的線程就不需要做內核態和用戶態之間的切換進入阻塞掛起狀態,它們只需要等一等(自旋),等持有鎖的線程釋放鎖后即可立即獲取鎖,這樣就避免用戶線程和內核的切換的消耗。


  4.重量級鎖


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


35 拷貝.jpg


       以上就是動力節點Java培訓機構小編介紹的“Java培訓教程:Java多線程詳解之Synchronized的底層實現”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。


  相關內容


  Java多線程編程詳解


  java多線程的狀態轉換以及基本操作


  JAVA多線程實現的四種方式


  Java多線程學習,深入解析


  常見Java多線程面試題總結


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 91福利视频网站 | 久久国内精品自在自线观看 | 男女羞羞视频免费观看 | 欧美日韩中文字幕久久伊人 | 欧美大片日韩精品四虎影视 | 新香蕉视频在线 | 曰鲁夜鲁鲁狠狠综合 | 欧美久久久久久久一区二区三区 | 天天拍拍天天爽免费视频 | h视频国产| 欧洲自拍偷拍 | 四虎国产精品永久一区 | 久久精品中文字幕极品 | 色视频在线免费看 | 国产精品久久自在自2021 | 国产福利91精品一区二区 | 日韩 欧美 亚洲 | 久久久久久久久66精品片 | 88国产经典欧美一区二区三区 | 国内精品久久久久影院网站 | 波多野结衣一区二区在线 | 久久精品中文字幕免费 | 免费永久国产在线视频 | 久久精品一区二区 | 在线国产视频一区 | 日韩精品一区二区三区免费视频 | 久久久精品一区 | 亚洲精品久久久久影 | 欧美毛片又粗又长又大 | 全部免费国产潢色一级 | 亚洲久久色 | 在线观看国产一区二区三区99 | 99爱在线精品视频免费观看9 | 四虎影视在线影院在线观看观看 | 欧美毛片又粗又长又大 | 成年人视频在线免费 | 热久久精品免费视频 | 久久亚洲国产的中文 | 九九影院理论片私人影院 | 久久久久夜 | 日韩欧美在线免费观看 |