ObjectMonitor的属性
1)header
:重量级锁保存MarkWord的位置。
2)own
:指向持有锁的线程,被加锁对象的MarkWord中保存了指向monitor的指针。
3)_cxq
队列:竞争队列。线程A持有锁未释放,线程B和C同时过来争抢锁,均被Block,此时线程B和C会被加入该队列中。
4)EntryList
队列:同步队列。线程A释放锁,线程B和C中会选定一个继承者(可以去争抢该锁),另一个线程会被放入EntryList队列中。(涉及QMode
,参考文章)
5)WaitSet
队列:等待队列。存放Object Wait的线程。
概述:
线程A持有锁,线程B竞争锁失败,进入_cxq
,下一轮竞争会将_cxq
中的线程移动到EntryList
。假设此时线程B竞争到了锁,然后线程B调用了Object#wait()
方法,此时线程B进入WaitSet
,并释放锁。线程C获取了锁,然后唤醒线程B,线程B从WaitSet
中出来竞争锁,如果竞争失败进入_cxq
,如此循环直到竞争成功。
资料:https://www.bilibili.com/video/BV1Fc411r74f/ 强推 河北王校长