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

Object中wait方法

阅读更多

       Object.wait调用的是share/vm/prims/jvm.cpp中的JVM_MonitorWait。

       void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)

       {

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

                 ObjectSynchronizer::wait(obj, ms, CHECK);

        }

        在此先看不用偏向锁的情况

        void ObjectSynchronizer::wait(Handle obj, jlong millis, TRAPS) {

                  ...........

                  ObjectMonitor* monitor = ObjectSynchronizer::inflate(THREAD, obj());//获取监视器

                  monitor->wait(millis, true, THREAD);//等待相应的时间

        }

        看看等待的具体实现

        void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) {

                   .........

                   ObjectWaiter node(Self);
                   node.TState = ObjectWaiter::TS_WAIT ;
                   Self->_ParkEvent->reset() ;
                   OrderAccess::fence();

                   //上面是创建一个等待的节点,准备放入等待队列中

                   Thread::SpinAcquire (&_WaitSetLock, "WaitSet - add") ; //进入临界区
                   AddWaiter (&node) ; //将等待节点加入等待队列
                   Thread::SpinRelease (&_WaitSetLock) ; //离开临界区

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

                   exit (Self) ;    //退出监视器,这地方操作蛮复杂的,在这个方法里面判断线程是否有锁

                                        //THREAD->is_lock_owned((address) _owner),如果没有锁抛出异常

                                        //IllegalMonitorStateException,所以说这里需要wait方法里面在synchronized块内

                                        //执行完exit,也就释放了锁,允许其他线程进入synchronized块

 

                   if (node._notified != 0 && _succ == Self) { //这一步是考虑别的线程已经进入上面的exit?

                            node._event->unpark();                   

                   }

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

                   if (node._notified == 0) { //线程在此等待
                             if (millis <= 0) {
                                           Self->_ParkEvent->park () ;
                             } else {
                                           ret = Self->_ParkEvent->park (millis) ;
                             }
                   }

                   //运行到这,意味着线程已经被唤醒

                   if (node.TState == ObjectWaiter::TS_WAIT) {
                           Thread::SpinAcquire (&_WaitSetLock, "WaitSet - unlink") ;
                           if (node.TState == ObjectWaiter::TS_WAIT) {
                                      DequeueSpecificWaiter (&node) ;       // 移出等待队列
                                      node.TState = ObjectWaiter::TS_RUN ; //修改标记为TS_RUN
                            }
                           Thread::SpinRelease (&_WaitSetLock) ;
                   }

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

                   //下面几句是线程重新获得锁,这里是因为上面的exit已经释放了锁,允许别的线程进入了

                   //synchronized块,所以要重新获取锁

                   if (v == ObjectWaiter::TS_RUN) { 

                            enter (Self) ;                     

                   }else{

                            ReenterI (Self, &node) ;
                            node.wait_reenter_end(this);

                   }

        }

        整体来说,这几段相当复杂,需要认真学习这里加锁的理论.

0
0
分享到:
评论

相关推荐

    java Object wait方法详细介绍

    主要介绍了java Object wait方法详细介绍的相关资料,需要的朋友可以参考下

    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()的用法进行了详细的分析介绍,需要的朋友可以过来参考下

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

    1.这两个方法来自不同的类,sleep是Thread类的方法,而wait是Object类的方法; 2.执行sleep方法后不会释放锁,而执行wait方法后会释放锁; 3.wait,notify和notifyAll只能在同步方法或同步代码块中调用,而sleep可以...

    Java的Object类讲解案例代码 equals()、hashCode()、finalize()、clone()、wait()

    本案例代码将详细展示Object类的使用方法,并提供一些实际场景下的案例,以帮助开发者更好地理解和运用这些方法。 这份案例代码适合以下人群: Java初学者:如果你是刚开始学习Java编程,那么Object类是一个重要的...

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

    创建多个condition对象 ...Condition类的awiat方法和Object类的wait方法等效 Condition类的signal方法和Object类的notify方法等效 Condition类的signalAll方法和Object类的notifyAll方法等效

    C#中sleep和wait的区别分析

    而wait是Object类的方法,它是使当前线程暂时放弃对象的使用权进行等待,必须放在同步方法或同步块里。 ②. Sleep使用的时候,线程并不会放弃对象的使用权,即不会释放对象锁,所以在同步方法或同步块中使用sleep,...

    12线程池调整

    如果线程还没有可供处理的工作,那么通过调用 Object.wait 方法(执行上下文切换)来消耗 CPU 时间。调整线程池大小,使线程的等待时间足够短,以防止它们由于空闲太长时间而被破坏。 线程池大小取决于工作负载和...

    Object- Oriented Programming with Ansi-C

    a fad, if Brian Kernighan and my publishers, Hans-Joachim Niclas and John Wait, had not encouraged me to publish the notes (and in due course to reinvent it all once more). My thanks go to them and to...

    100家大公司java笔试题汇总

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

    Object-Oriented Software Construction 2nd

    30.7 WAIT CONDITIONS 990 30.8 REQUESTING SPECIAL SERVICE 998 30.9 EXAMPLES 1003 30.10 TOWARDS A PROOF RULE 1022 30.11 A SUMMARY OF THE MECHANISM 1025 30.12 DISCUSSION 1028 30.13 KEY CONCEPTS ...

    tomcat 安全规范(tomcat安全加固和规范)

    tomcat是一个开源Web服务器,基于Tomcat的Web运行效率高,可以在一般的硬件平台上流畅运行,因此,颇受Web站长的青睐。不过,在默认配置下其存在一定的安全隐患,可被恶意攻击

    Java中ReentrantLock的使用.docx

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

    oracle ora-00054:resource busy and acquire with nowait specified解决方法

    当某个数据库用户在数据库中插入、更新、删除一个表的数据,或者增加一个表的主键时或者表的索引时,常常会出现ora-00054:resource busy and acquire with nowait specified这样的错误。 主要是因为有事务正在执行...

    锁、生产者与消费者.pdf

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

    后端JAVA虚拟机JVM调优必备工具

    IBM Thread and Monitor Dump Analyzer for Java专业JVM调优工具 一、使用方法 1.使用java -jar启动程序 2.... 3.... 4....对象等待中,Object.wait()  7.阻塞,Blocked(重点关注)  8.停止,Parked

    深入多线程之:Wait与Pulse的使用详解

    Monitor借助它的静态方法Wait,Pulse,PulseAll提供了一个更给力的信号构造,使用这些方法和lock语句,你可以自己实现AutoResetEvent,ManualResetEvent和Semaphore。甚至WaitHandle的WaitAll和WaitAny方法了。怎样...

    jstack生成的Thread Dump日志.docx

    其中在 "Entry Set" 中等待的线程状态是 waiting for monitor entry,在 "Wait Set" 中等待的线程状态是 in Object.wait()。 (1)"Entry Set"里面的线程。 我们称被 synchronized 保护起来的代码段为临界区,...

    JavaEE技术问题汇总.docx

    Java中object常用方法 静态代理和动态代理 CGLIB代理和JDK代理 ”static”关键字是什么意思?Java中是否可以覆盖一个private或者是static的方法? cas单点登录的基础原理、实现 cas如何里连接本

Global site tag (gtag.js) - Google Analytics