线程使用的时候经常会看到IllegalMonitorStateException异常,那么Monitor究竟是什么
当对象被实例化的时候,jvm会给该对象生成一个ObjectMonitor对象,打开objectMonitor.hpp头文件:
ObjectMonitor() {
_header = NULL;
_count = 0;
_waiters = 0,
_recursions = 0;
_object = NULL;
_owner = NULL;
_WaitSet = NULL;
_WaitSetLock = 0 ;
_Responsible = NULL ;
_succ = NULL ;
_cxq = NULL ;
FreeNext = NULL ;
_EntryList = NULL ;
_SpinFreq = 0 ;
_SpinClock = 0 ;
OwnerIsThread = 0 ;
}
具体代码没有读过,因为是c的读起来比较晦涩,所以总结了下之前学习看到过的一些结论。
对象中的_EntryList类似AQS中的等待队列,_WaitSet存放调用了wait()函数的线程,当一个object.wait()后会将改object从_EntryList中移到_WaitSet中,等待notify()后再放入_EntryList中,这也证明了notify只会随机唤醒一个线程。
以上是目前一些理解,等有机会再深入更新
——————————————————————————————
补充:终于找到大神的博客解释,我觉得把wait讲解的很清楚了:
https://blog.csdn.net/java_lyvee/article/details/110996764