【问题标题】:Understanding notify method in HotSpot了解 HotSpot 中的通知方法
【发布时间】:2018-07-08 17:18:47
【问题描述】:

我试图了解 notify 如何唤醒一个线程并面临一些关于热点 (jdk8) 中的实现细节的误解。

我们在Object 中声明了wait/notify 作为本机方法,它们在此处实现: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.我没有很好地阅读 C++,但我认为正在发生的事情是所有在监视器上阻塞的 Java 线程都存储在一个列表(队列)中。并且要对该列表进行操作需要互斥锁。这就是首先调用_WaitSetLock 的原因。所以这里有两个线程安全的概念。一个是针对正在被操作的线程列表,而第二个是针对我们正在操作的数据结构。
  • 2.对于线程状态,我假设 JVM 使用线程的操作系统实现,并且操作系统直接设置这些线程的状态。
  • @markspace 2. 但是当wait_reenter_begin被调用时,线程的状态被设置为BLOCKED_ON_MONITOR_ENTER显式here。但是当线程是 Runnable 时,它​​的状态是(显然?)RUNNABLE。我希望即使 JVM 使用操作系统线程,它也应该将状态设置为 RUNNABLE 无论如何,不​​是吗?

标签: java multithreading jvm jvm-hotspot


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

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

【讨论】:

  • 如果WaitSet 中的线程被中断是推入cxq 还是EntryList?或者它只是从WaitSet中删除?
  • @St.Antario 一个中断的线程通过ObjectMonitor::enter重新进入锁。据我所知,进入锁的线程首先将自己推到_cxq
猜你喜欢
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
相关资源
最近更新 更多