老师您好,关于您讲的EntryList和WaitSet我有几点疑问
来源:4-8 如果被问偏向锁、轻量级锁、重量级锁

大东来提高
2021-06-07
您讲的是从进入EntryList到EntryList比如头结点去竞争临界区这一过程叫轻量级锁,通过一系列自旋入队,自旋竞争临界区,然后经过几次失败后加入到WaitSet变成了重量级锁
我看有些博客或者老师是这么说的,轻量级锁就是上来直接去改CAS将markword里记录的monitor的owner,失败几次直接封装成ObjectWaiter(有线程记录)进入EntryList变为重量级锁,然后WaitSet只是用来存调用wait()方法的ObjectWaiter,而在WaitSet里的所有线程都不能去竞争锁,除非调用modify回到EntryList才可以去竞争锁,这和您说的不太一样了
所以问题就是
1.EntryList您讲的是偏向于轻量级锁实现的整个流程,但是我看有些文章只是说,在这里面所有的线程都可以去竞争锁,并且已经升级为重量级锁
2.WaitSet您讲的是偏向于重量级锁,可以去竞争锁,但是有些文章或者老师是说,因为调用了wait进入WaitSet,所以这个里面所有线程都不能去竞争锁,除非modify,重新进入EntryList后再去竞争锁
2回答
-
求老仙
2021-06-24
所以从性能的角度,monitor和aqs的思考是类似的:在竞争激烈的情况下用cas loop减少一部分竞争(让一部分线程休眠)。那么cas为啥不设计偏向锁?因为偏向锁是个微优化,今天这个时代已经没用了。
10 -
求老仙
2021-06-24
抛开老师怎么讲的哈,我们梳理下。
线程少的情况下,cas loop性能更好。线程多,不能都cas loop,有一些线程要让它们休眠。那么这个怎么做到呢?需要做一个队列,或者集合。总之哪些线程休眠了,程序应该知道。这样有线程释放锁的时候,可以唤醒一部分线程再去竞争。
10
相似问题