Javasynchronized底層的實現原理_第1頁
Javasynchronized底層的實現原理_第2頁
Javasynchronized底層的實現原理_第3頁
Javasynchronized底層的實現原理_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第Javasynchronized底層的實現原理目錄監視器底層實現執行流程總結前言:

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

監視器

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

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

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

底層實現

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

示例代碼如下:

publicclassSynchronizedToMonitorExample{

publicstaticvoidmain(String[]args){

intcount=0;

synchronized(SynchronizedToMonitorExample.class){

for(inti=0;ii++){

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:TheOwner擁有者,是持有該ObjectMonitor(監視器)對象的線程;_EntryList:EntryList監控集合,存放的是處于阻塞狀態的線程隊列,在多線程下,競爭失敗的線程會進入EntryList隊列。_WaitSet:WaitSet待授權集合,存放的是處于wait狀態的線程隊列,當線程執行了wait()方法之后,會進入WaitSet隊列。

監視器執行的流程如下:

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

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

總結

synchronized同步鎖是通過JVM內置的Monitor監視器實現的,而監視器又是依賴操作系統的互斥鎖Mutex實現的。JVM監視器的執行流程是:線程先通過自旋CAS的方式嘗試獲取鎖,如果獲取失敗就進入

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論