monitor的jvm底层实现

waitset

等待队列,在java9 中是objectMonitor的一个内部类;
具体构造函数如下:

ObjectWaiter::ObjectWaiter(Thread* thread) {
     _next     = NULL;
    _prev     = NULL;
     _notified = 0;
      TState    = TS_RUN;
      _thread   = thread;
    _event    = thread->_ParkEvent;
    _active   = false;
    assert(_event != NULL, "invariant");
}
  1. 双端队列
  2. notified 标志位是0
  3. TState是TS_RUN
  4. active标志位

waitSet由waitObject构成;

入栈操作

前提:一个 POJO A != null;
在没有获取A的对象锁的前提下直接调用 A.wait() 将会抛出一个IllegalMonitorException,内部的检查逻辑也在这个cpp文件中,是一个宏指令:

#define CHECK_OWNER()                                                
do {                                                                              
       if (THREAD != _owner) {                                                 
              if (THREAD->is_lock_owned((address) _owner)) {                        
                _owner = THREAD;  /* Convert from basiclock addr to Thread addr */  
                _recursions = 0;                                                   
               } else {                                                              
                TEVENT(Throw IMSX);                                                 
                THROW(vmSymbols::java_lang_IllegalMonitorStateException());         
              }                                                                         
        }                                                                              
 } while (false)