`
xieyj
  • 浏览: 99959 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Object中notify方法

阅读更多

    Object.java类中notify调用的是share/vm/prims/jvm.cpp中的JVM_MonitorNotify。

    void JVM_MonitorNotify(JNIEnv* env, jobject handle)

    {

             Handle obj(THREAD, JNIHandles::resolve_non_null(handle));

             ObjectSynchronizer::notify(obj, CHECK);

    }

    看看ObjectSynchronizer::notify方法

    void ObjectSynchronizer::notify(Handle obj, TRAPS)

    {

             ObjectSynchronizer::inflate(THREAD, obj())->notify(THREAD);

    }

    上面的inflate获得一个ObjectMonitor,看看它的具体实现

    void ObjectMonitor::notify(TRAPS)

   {

             if (_WaitSet == NULL) { //没有等待的线程,直接返回
                    return ;
             }

             Thread::SpinAcquire (&_WaitSetLock, "WaitSet - notify") ; //进入同步区域

             ObjectWaiter * iterator = DequeueWaiter() ; //获得一个等待对象

             if (iterator != NULL) {

                   ObjectWaiter * List = _EntryList ; //唤醒队列

                   //将唤醒的任务加入队列

                   if (List == NULL) {
                            iterator->_next = iterator->_prev = NULL ;
                           _EntryList = iterator ;
                   } else {
                           iterator->TState = ObjectWaiter::TS_CXQ ;
                           for (;;) {
                                     ObjectWaiter * Front = _cxq ;
                                     iterator->_next = Front ;
                                     if (Atomic::cmpxchg_ptr (iterator, &_cxq, Front) == Front) {
                                              break ;
                                     }
                            }
                   }

             }

             iterator->wait_reenter_begin(this);

             Thread::SpinRelease (&_WaitSetLock) ; //离开同步区域

             ...........

    }

    在上面的代码中,只看到了将当前的线程加入唤醒队列的操作,但在wait方法中执行了park()操作,那是执行操作系统的等待方法。上面的步骤显然不能直接唤醒线程运行,那这线程是如何真正运行的呢?

    我们知道wait和notify操作是在一个同步块内执行的,如果不在同步块内,会报IllegalMonitorStateException(非法监视器状态违例),真正唤醒的动作是在离开同步块时候,也就是monitorexit操作。

    好,我们再看看monitorexit的执行代码,看看是否正确,看看InterpreterRuntime::monitorexit代码

    void InterpreterRuntime::monitorexit(JavaThread* thread, BasicObjectLock* elem)

    {

             Handle h_obj(thread, elem->obj());

             ObjectSynchronizer::slow_exit(h_obj(), elem->lock(), thread);

    }

    跟踪进去,调用的是

    void  ObjectMonitor::exit

    {

             ...........

             w = _EntryList  ;
              if (w != NULL) {
                       ExitEpilog (Self, w) ;
                       return ;
              }

    }

    void ObjectMonitor::ExitEpilog (Thread * Self, ObjectWaiter * Wakee) {

              ParkEvent * Trigger = Wakee->_event ;

              .............

              Trigger->unpark() ; //通过操作系统提供的方法,真正唤醒线程

    }

    在上面可以证实是在监视器退去时候真正唤醒线程,同时也就明白了wait和notify 必须在synchronized块里面调用的原因,再回顾上篇wait代码中,也就理解了wait方法内必须执行退出监视器的原因。

1
2
分享到:
评论

相关推荐

    Object类wait及notify方法原理实例解析

    主要介绍了Object类wait及notify方法原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java 中Object的wait() notify() notifyAll()方法使用

    主要介绍了Java 中Object的wait() notify() notifyAll()方法使用的相关资料,需要的朋友可以参考下

    Object.wait()与Object.notify()的用法详细解析

    以下是对java中Object.wait()与Object.notify()的用法进行了详细的分析介绍,需要的朋友可以过来参考下

    java多线程系列(四)ReentrantLock的使用.docx

    创建多个condition对象 一个condition对象的signal(signalAll)方法和该对象的await方法是一一...Condition类的signal方法和Object类的notify方法等效 Condition类的signalAll方法和Object类的notifyAll方法等效

    sleep()、wait()、yield()和join()方法特点及区别.docx

    3.wait,notify和notifyAll只能在同步方法或同步代码块中调用,而sleep可以在任何地方调用; 4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。(如果不是在同步方法或同步代码块中调用wait()方法,...

    Orbacus Notify Guide

    This manual describes Orbacus Notify, an implementation of the Object Management Group’s Notification Service specification.

    Java中ReentrantLock的使用.docx

    重入锁ReentrantLock 相对来说是synchronized、Object.wait()和Object.notify()方法的替代品(或者说是增强版),在JDK5.0的早期版本,重入锁的性能远远好于synchronized,但从JDK6.0开始,JDK在synchronized上做了...

    vue逐行注释分析+40多m的vue源码程序流程图思维导图

    1.vue源码读取流程 1.new Vue 调用的是 Vue.prototype._init 从该函数开始经过 $options 参数合并之后 ...然后set方法就是调用dep中的notify方法调用wacther中的run更新视图 3.vue从字符串模板怎么到真实的dom呢?是

    锁、生产者与消费者.pdf

    注意:上述方法只能被同步监听锁对象来调用,这也是为啥wait() 和 notify()方法都在 Object 对象中,因为同步监听锁可以是任意对象,只不过必须是需要同步线程的共同对象即可,否则别的对象调用会报错:  java.lang...

    100家大公司java笔试题汇总

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。) sleep...

    计算机等级考试二级java经典例题

    计算机二级java实战例题 有时,某个线程进入"synchronized"块后,共享数据的状态并不一定满足线程的需要,它要等待其他线程将共享数据改变为它...这两个方法使java.lang.object类的方法,使实现线程通信的两个方法。

    observe-shim:Object.observe Harmony 提案的垫片(请参阅

    Object.observe shim 请参阅:。... Object.getNotifier(myObject).notify({ type : "updated" , ....}); 观察实用程序: 可以在他找到有助于使用此 shim 的实用程序 例子 : var myObject = {}; Observ

    Java2023年最新免费面试题及答案附答案汇总.md 免费下载,不需要积分

    为什么线程通信的方法wait(), notify()和notifyAll()被定义在Object 类里 遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么 String str="i"与 String str=new String("i")一样吗 用过ConcurrentHashMap,...

    java笔试题大集合及答案(另附各大公司笔试题)

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 62、同步和...

    java多线程设计模式详解(PDF及源码)

    wait set——线程的休息室 wait方法——把线程放入wait set notify方法——从wait set拿出线程 notifyAll方法——从wait set拿出所有线程 wait、notify、notifyAll是Object类的方法 线程的状态移转 跟线程有关的其他...

    OOP_EN_V3_0.pdf

    Object-oriented Programming PacDrive 3 The information provided in this documentation contains general descriptions and/or technical characteristics of the performance of the products contained herein...

    java 面试题 总结

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 14、Overload...

    Intel Hexadecimal Object File Format Specification V1.0.0

    without obligation of Intel to notify any person of such revision or changes. The publication of this specification should not be construed as a commitment on Intel's part to implement any product.

    Android代码-jdeferred

    JDeferred JDeferred is a Java Deferred/Promise library similar to JQuery's Deferred Object. Inspired by JQuery and Android Deferred Object. Features Deferred object and Promise ...deferred.notify(0.80);

    超级有影响力霸气的Java面试题大全文档

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...

Global site tag (gtag.js) - Google Analytics