成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試突擊:Synchronized底層是如何實現的?

開發 后端
synchronized 同步鎖是通過 JVM 內置的 Monitor 監視器實現的,而監視器又是依賴操作系統的互斥鎖 Mutex 實現的。

作者 | 磊哥

來源 | Java面試真題解析(ID:aimianshi666)

轉載請聯系授權(微信ID:GG_Stone)

想了解 synchronized 是如何運行的?就要先搞清楚 synchronized 是如何實現?synchronized 同步鎖是通過 JVM 內置的 Monitor 監視器實現的,而監視器又是依賴操作系統的互斥鎖 Mutex 實現的,那接下來我們先來了解一下監視器。

監視器

監視器是一個概念或者說是一個機制,它用來保障在任何時候,只有一個線程能夠執行指定區域的代碼。

一個監視器像是一個建筑,建筑里有一個特殊的房間,這個房間同一時刻只能被一個線程所占有。一個線程從進入該房間到離開該房間,可以全程獨占該房間的所有數據。進入該建筑叫做進入監視器(entering the monitor),進入該房間叫做獲得監視器(acquiring the monitor),獨自占有該房間叫做擁有監視器(owning the monitor),離開該房間叫做釋放監視器(releasing the monitor),離開該建筑叫做退出監視器(exiting the monitor)。

嚴格意義來說監視器和鎖的概念是不同的,但很多地方也把二者相互指代。

底層實現

下面我們在代碼中添加一個 synchronized 代碼塊,來觀察一下它在字節碼層面是如何實現的?示例代碼如下:

public class SynchronizedToMonitorExample {
public static void main(String[] args) {
int count = 0;
synchronized (SynchronizedToMonitorExample.class) {
for (int i = 0; i < 10; i++) {
count++;
}
}
System.out.println(count);
}
}

當我們將上述代碼編譯成字節碼之后,得到的結果是這樣的: 從上述結果我們可以看出,在 main 方法中多了一對 monitorenter 和 monitorexit 的指令,它們的含義是:

  • monitorenter:表示進入監視器。
  • monitorexit:表示退出監視器。

由此可知 synchronized 是依賴 Monitor 監視器實現的。

執行流程

在 Java 中,synchronized 是非公平鎖,也是可以重入鎖。所謂的非公平鎖是指,線程獲取鎖的順序不是按照訪問的順序先來先到的,而是由線程自己競爭,隨機獲取到鎖。可重入鎖指的是,一個線程獲取到鎖之后,可以重復得到該鎖。這些內容是理解接下來內容的前置知識。在 HotSpot 虛擬機中,Monitor 底層是由 C++實現的,它的實現對象是 ObjectMonitor,ObjectMonitor 結構體的實現如下:

ObjectMonitor::ObjectMonitor() {  
_header = NULL;
_count = 0;
_waiters = 0,
_recursions = 0; //線程的重入次數
_object = NULL;
_owner = NULL; //標識擁有該monitor的線程
_WaitSet = NULL; //等待線程組成的雙向循環鏈表,_WaitSet是第一個節點
_WaitSetLock = 0 ;
_Responsible = NULL ;
_succ = NULL ;
_cxq = NULL ; //多線程競爭鎖進入時的單向鏈表
FreeNext = NULL ;
_EntryList = NULL ; //_owner從該雙向循環鏈表中喚醒線程結點,_EntryList是第一個節點
_SpinFreq = 0 ;
_SpinClock = 0 ;
OwnerIsThread = 0 ;
}

在以上代碼中有幾個關鍵的屬性:

  • _count:記錄該線程獲取鎖的次數(也就是前前后后,這個線程一共獲取此鎖多少次)。
  • _recursions:鎖的重入次數。
  • _owner:The Owner 擁有者,是持有該 ObjectMonitor(監視器)對象的線程;
  • _EntryList:EntryList 監控集合,存放的是處于阻塞狀態的線程隊列,在多線程下,競爭失敗的線程會進入 EntryList 隊列。
  • _WaitSet:WaitSet 待授權集合,存放的是處于 wait 狀態的線程隊列,當線程執行了 wait() 方法之后,會進入 WaitSet 隊列。

監視器執行的流程如下:

  1. 線程通過 CAS(對比并替換)嘗試獲取鎖,如果獲取成功,就將 _owner 字段設置為當前線程,說明當前線程已經持有鎖,并將 _recursions 重入次數的屬性 +1。如果獲取失敗則先通過自旋 CAS 嘗試獲取鎖,如果還是失敗則將當前線程放入到 EntryList 監控隊列(阻塞)。
  2. 當擁有鎖的線程執行了 wait 方法之后,線程釋放鎖,將 owner 變量恢復為 null 狀態,同時將該線程放入 WaitSet 待授權隊列中等待被喚醒。
  3. 當調用 notify 方法時,隨機喚醒 WaitSet 隊列中的某一個線程,當調用 notifyAll 時喚醒所有的 WaitSet 中的線程嘗試獲取鎖。
  4. 線程執行完釋放了鎖之后,會喚醒 EntryList 中的所有線程嘗試獲取鎖。

以上就是監視器的執行流程,執行流程如下圖所示:

總結

synchronized 同步鎖是通過 JVM 內置的 Monitor 監視器實現的,而監視器又是依賴操作系統的互斥鎖 Mutex 實現的。JVM 監視器的執行流程是:線程先通過自旋 CAS 的方式嘗試獲取鎖,如果獲取失敗就進入 EntrySet 集合,如果獲取成功就擁有該鎖。當調用 wait() 方法時,線程釋放鎖并進入 WaitSet 集合,等其他線程調用 notify 或 notifyAll 方法時再嘗試獲取鎖。鎖使用完之后就會通知 EntrySet 集合中的線程,讓它們嘗試獲取鎖。

參考資料

  • www.cnblogs.com/freelancy/p/15625602.html blog.csdn.net/qq_43783527/article/details/114669174
  • www.cnblogs.com/hongdada/p/14513036.html。
責任編輯:姜華 來源: Java面試真題解析
相關推薦

2022-04-11 07:40:45

synchroniz靜態方法程序

2021-01-08 08:34:09

Synchronize線程開發技術

2022-04-24 07:59:53

synchronizJVMAPI

2022-12-26 09:27:48

Java底層monitor

2022-04-06 07:50:28

線程安全代碼

2022-01-13 06:59:40

HashMap底層面試

2022-09-07 07:05:25

跨域問題安全架構

2022-03-23 08:51:21

線程池Java面試題

2022-02-28 07:01:22

線程中斷interrupt

2022-04-20 07:47:00

notify喚醒線程JVM

2022-03-14 07:32:06

線程池拒絕策略自定義

2022-01-24 07:01:20

安全多線程版本

2023-10-12 08:19:04

Monitor線程

2022-07-06 07:35:19

group byMySQL

2021-07-04 08:01:30

Synchronize線程安全并發編程

2024-03-15 15:12:27

關鍵字底層代碼

2022-08-01 07:07:15

粘包半包封裝

2022-05-30 07:34:33

三范式Java

2022-09-12 22:27:05

編程式事務聲明式事務對象

2025-04-08 00:00:00

@AsyncSpring異步
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区回区在观看免费视频 | 亚洲成人久久久 | 国产精品完整版 | 欧产日产国产精品视频 | www.天天操.com | 伊人久麻豆社区 | 99亚洲精品 | 超碰日韩 | 亚洲国产精品久久久久秋霞不卡 | 免费国产一区二区 | 2021天天干夜夜爽 | 日本一区二区高清不卡 | 日韩超碰| 99精品国自产在线 | 一区二区免费视频 | 一级黄色淫片 | 久久国产精品久久 | 亚洲精品在线看 | 在线日韩av电影 | 国产精品国产三级国产aⅴ中文 | 波多野结衣一区二区三区在线观看 | 日本三级电影免费观看 | 在线精品一区二区 | 日本a视频 | 18av在线播放| 天天操妹子| 男女视频在线观看网站 | 欧美日韩国产不卡 | av喷水 | 羞羞午夜| 欧美一级在线观看 | 成人黄色电影在线观看 | 91看片网址 | 亚洲天堂中文字幕 | 91精品国产综合久久婷婷香蕉 | 精品国产18久久久久久二百 | 九九热九九| 亚洲成人精品 | 精品视频一区二区三区在线观看 | 成年人免费网站 | 成人一区二区电影 |