youyichannel

志于道,据于德,依于仁,游于艺!

0%

Synchronized全解读-10

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/ 强推 河北王校长