當前位置:編程學習大全網 - 編程語言 - Synchronize的實現原理

Synchronize的實現原理

Java對象在JVM中的結構如下:

java對象包括:

對象都在32/64位機器中每個部分分別是32/64位,Class Pointer在64位機器默認開啟指針壓縮,只占用32位。

對象加鎖使用的是Mark Word字段,如下是32位的Mark Word

通過 synchronize 關鍵字給對象加鎖的過程如下:

JVM引入偏向鎖是為了在無多線程競爭的情況下盡量減少不必要的輕量級鎖執行路徑,因為輕量級鎖的獲取及釋放依賴多次CAS原子指令,而偏向鎖只需要在置換 ThreadID 的時候依賴壹次CAS原子指令( 壹旦出現多線程競爭的情況就必須撤銷偏向鎖 )。

偏向鎖只有遇到其他線程嘗試競爭偏向鎖時,持有偏向鎖的線程才會釋放鎖,線程不會主動去釋放偏向鎖 。偏向鎖的撤銷,需要等待全局安全點(在這個時間點上沒有字節碼正在執行),它會首先暫停擁有偏向鎖的線程,判斷鎖對象是否處於被鎖定狀態,撤銷偏向鎖後恢復到未鎖定(標誌位為“01”)或輕量級鎖(標誌位為“00”)的狀態。

輕量級鎖所適應的場景是線程交替執行同步塊的情況,如果存在同壹時間訪問同壹鎖的情況,就會導致輕量級鎖膨脹為重量級鎖。

synchronize的實現過程:

註意 :lock前綴指令的功能:Synchronize, volatile,CMS都是使用這個實現

當鎖膨脹成重量級鎖的時候,在JVM中當前鎖對象關聯的ObjectMonitor對象。

ObjectMonitor對象的數據結構如下:

EntryList是壹個後進先出的雙向鏈表,AQS(ReentrantLock)是壹個先進先出的雙向鏈表。

ObjectMoniter的流程:

註意:

Synchronize只有壹個WaitSet,AQS可以創建多個Condition隊列(功能和Waitset類似)。

synchronize的實現原理_技術流水-CSDN博客_synchronize

  • 上一篇:MP4是什麽?MP4有多少種格式?MP4下載到手機上是什麽格式?
  • 下一篇:26歲的女人看什麽書?
  • copyright 2024編程學習大全網