了解 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) ;
.
为什么我们在将一个出队线程从等待队列添加到 cxq
之前时会有 CAS?自从我们已经获得 _WaitSetLock
以来,那里似乎没有争论。
谁修改了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
_WaitSetLock
仅保护 _WaitSet
(在该对象监视器上称为 wait
的线程列表)。同时 _cxq
不仅可以从 notify
同时访问,还可以从其他函数同时访问,特别是 ObjectMonitor::enter
和 exit
.
notify
不修改线程状态。当目标线程离开时状态发生变化 JVM_MonitorWait
. It is done by JavaThreadInObjectWaitState
destructor which implicitly calls ~JavaThreadStatusChanger()
.
我试图了解 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) ;
.
为什么我们在将一个出队线程从等待队列添加到
cxq
之前时会有 CAS?自从我们已经获得_WaitSetLock
以来,那里似乎没有争论。谁修改了
JavaThread
状态?我们有iterator->wait_reenter_begin(this);
at the end ofvoid ObjectWaiter::notify
, but this does not doset_thread_status(java_thread, java_lang_Thread::RUNNABLE);
like in wait_reenter_end
_WaitSetLock
仅保护_WaitSet
(在该对象监视器上称为wait
的线程列表)。同时_cxq
不仅可以从notify
同时访问,还可以从其他函数同时访问,特别是ObjectMonitor::enter
和exit
.notify
不修改线程状态。当目标线程离开时状态发生变化JVM_MonitorWait
. It is done byJavaThreadInObjectWaitState
destructor which implicitly calls~JavaThreadStatusChanger()
.