zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    Struts2中ModelDriven的使用
    Android 如何让 app 自行处理 power key M
    url后面带斜杠与不带斜杠的区别
    Http Request Method:options
    org.springframework.boot.builder.SpringApplicationBuilder.<init>
    Uncaught (in promise) DOMException: Failed to execute 'open' on 'XMLHttpRequest': Invalid URL
    git将多个commit合并成一个
    idea error:Command line is too long
    java使用zxing插件绘制二维码
    git解决冲突插件之Beyond Compare
  • 原文地址:https://www.cnblogs.com/webor2006/p/11443392.html
Copyright © 2011-2022 走看看