線程使用的時候經(jīng)常會看到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的讀起來比較晦澀,所以總結(jié)了下之前學(xué)習(xí)看到過的一些結(jié)論。
對象中的_EntryList類似AQS中的等待隊列,_WaitSet存放調(diào)用了wait()函數(shù)的線程,當一個object.wait()后會將改object從_EntryList中移到_WaitSet中,等待notify()后再放入_EntryList中,這也證明了notify只會隨機喚醒一個線程。
以上是目前一些理解,等有機會再深入更新
——————————————————————————————
補充:終于找到大神的博客解釋,我覺得把wait講解的很清楚了:
https://blog.csdn.net/java_lyvee/article/details/110996764