上一次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。