Java精通並發-透過openjdk源碼分析wait與notify方法的本地實現


上一次https://www.cnblogs.com/webor2006/p/11442551.html中通過openjdk從c++的底層來審視了ObjectMonitor的底層實現,這次繼續來探究底層,對於wait()和notify()的底層細節到底是啥樣的呢?下面還是先來到openjdk中來打開ObjectMonitor.hpp,其中它里面有一個很重要的類:

然后我們要分析的wait()和notify()是在它的cpp實現文件中,所以打開ObjectMonitor.cpp來直奔主題:

其中我們在Java層看到的wait()方法的最終實現就是這個cpp中的這個方法:

先縱覽一下該方法的實現,代碼量比較多,有將近200多行的代碼,全部看通是不可能的,挑重點的來看:

 

而Self其實是一個線程:

 

所以這句話的是將線程包裝成了ObjectWaiter對象了:

另外會將狀態改為等待狀態:

 

另外,在上次的理論中我們知道在調用了wait()之后,會將其加入到WaitSet當中,如:

 

那么。。具體對應的底層代碼在哪呢?看下面:

好,下面來瞅一下它的具體實現:

再回到wait()方法繼續,其中可以看到有自旋鎖的東東:

 

下面簡單的縱覽一下它:

好,下面再來觀測一下notify()方法的細節:

 

 

 咱們看一下DequeueWaiter()方法是怎么實現的:

 

回到主流程:

其實在notify()的官網中也有類似的說明:

 

而文檔中提到的“具體實現”其實就是如我們看到cpp中這塊的代碼,不同的策略其實現也不一樣。

照我們之前的理論來說,喚醒的線程會被放到EntryList當中:

 

 在notify()代碼中也能看到:

然后最后會看到有一個這個代碼:

以上就是從底層c++的角度來審視我們在java上調用的wait()和notify()的具體細節,雖說大致看了一下主流程,實際工作也沒啥大的作用,但是!!!對我們的更深入的理解起到了非常重要的作用,畢境可以讓你能更加自信的用Java的這些API。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM