都是这样,离开临界区释放锁。
偏向锁可以直接成为Owner;没有Owner的时候,轻量级锁可以直接成Owner;不能直接拿到Owner才会到重量级锁。 (现在Java偏向锁去掉了)。不过几个Owner描述不太一样,偏向锁直接有一个bit,轻量级锁+重量级锁是设置一个threadID。这个也很好理解,偏向锁目标就是在没有线程竞争的过程中用的。
EntrySet的设计是为了分流;WaitSet的设计是为了等待。EntrySet慢慢竞争总会进去,但是EntrySet本质上什么也不做,只不过每次从里面取出一部分来竞争锁(减少并发压力),任何线程竞争失败当然就直接去等待了。
同一时刻,有多少个线程想要竞争是不确定的。EntrySet的设计是为了减少这种压力,具体几个要看算法的实现。或者说几个都行,取出一部分竞争即可。简单来说,做JVM的人有具体数据,知道该如何操作在平均情况下性能较好。
离开临界区就不用再进入Wait了。如果是执行了一半wait了,就进入wait。
文档错了。 没有Owner才会触发竞争Owner。有Owner才会走EntrySet的机制。
总结下,现在Java在弱化偏向锁和轻量级锁。你可以看到当年Java设计这些锁是为了应对并发量较低的场景,现在并发量较低的场景性能再去微优化价值已经不大了。