了解 HotSpot 中的通知方法

Understanding notify method in HotSpot

我试图了解 notify 如何唤醒线程,但对热点 (jdk8) 中的实现细节存在一些误解。

我们在Object中声明了wait/notify作为本地方法,它们在这里实现:wait and notify. Since static int Knob_MoveNotifyee = 2 ; I expected that the following code负责执行唤醒:

 if (Policy == 2) {      // prepend to cxq
     // prepend to cxq
     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 ;
            }
        }
     }
 }

但问题是方法 void ObjectWaiter::notify 被包装到 Thread::SpinAcquire (&_WaitSetLock, "WaitSet - notify"); /Thread::SpinRelease (&_WaitSetLock) ;.

  1. 为什么我们在将一个出队线程从等待队列添加到 cxq 之前时会有 CAS?自从我们已经获得 _WaitSetLock 以来,那里似乎没有争论。

  2. 谁修改了JavaThread状态?我们有 iterator->wait_reenter_begin(this); at the end of void ObjectWaiter::notify, but this does not do set_thread_status(java_thread, java_lang_Thread::RUNNABLE); like in wait_reenter_end

  1. _WaitSetLock 仅保护 _WaitSet(在该对象监视器上称为 wait 的线程列表)。同时 _cxq 不仅可以从 notify 同时访问,还可以从其他函数同时访问,特别是 ObjectMonitor::enterexit.

  2. notify不修改线程状态。当目标线程离开时状态发生变化 JVM_MonitorWait. It is done by JavaThreadInObjectWaitState destructor which implicitly calls ~JavaThreadStatusChanger().