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。

posted on 2019-09-01 19:59  cexo  阅读(1557)  评论(5编辑  收藏  举报

导航