gpt4 book ai didi

java - 了解HotSpot中的notify方法

转载 作者:行者123 更新时间:2023-11-30 06:06:20 26 4
gpt4 key购买 nike

我试图了解notify如何唤醒线程,并在hotspot(jdk8)中遇到了一些关于实现细节的误解。

我们将 wait/notify 声明为 Object 内的 native 方法,并在此处实现:waitnotify 。由于 static int Knob_MoveNotifyee = 2 ; 我预计 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 ,但这并不像wait_reenter_end中那样执行set_thread_status(java_thread, java_lang_Thread::RUNNABLE);

最佳答案

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

  2. notify 不会修改线程状态。当目标线程离开JVM_MonitorWait时状态发生变化。它是由 JavaThreadInObjectWaitState 完成的隐式调用 ~JavaThreadStatusChanger() 的析构函数.

关于java - 了解HotSpot中的notify方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51234369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com