进入到重量级锁后, 新进入的线程,entryset 的竞争方式?
来源:1-2 解读面霸才懂的5个规则

上游猴子
2021-09-24
老师,有几个疑惑?
无论偏向锁, 轻量级锁,重量级锁都是为了争夺进去临界区的权限
1. 无竞争情况下, 采用偏向锁设计, 获取锁并进入临界区.
2. 多线程竞争, 则升级为轻量级锁设计. 通过查看 monitor 是否存在持有者, 此时会产生两种情况.
2.1 情况一 (monitor 有持有者)
monitor 有持有者, 通过自旋竞争加入到 entrySet 中, 对于 entrySet 最先进入的节点线程会通过自旋竞争的方式获取锁, 如果拿到锁则为就绪状态。(此时维持轻量级锁设计模式)
如果竞争失败, 则进入 waitSet , 此时升级为重量级锁设计. 后续 entryset 不在是通过自旋竞争, 而是和 waitset 保持一致 ,利用操作系统API提供的互斥能力进行竞争.
有几个问题?
重量级锁下, entryset 不会主动进入 waitset, 而是等到持有者执行完代码块或 notity/notityall 通知,entryset(最先进入的节点) 和 waitset 同时进行竞争, 所以是 entryset 竞争失败才会进入 waitset?
重量级锁下,此时有新线程进入, 还会继续判断 monitor 是否存在持有者? 如果要判断, 假设不存在持有者, 直接利用操作系统API提供的互斥能力进行竞争? 如果不判断, 那是直接自旋竞争进入 entryset ?
2.2 情况二 (monitor 无持有者)
monitor 无持有者, 通过自旋竞争, 拿到锁则为就绪状态. 否则进入 waitset , 此时升级为重量级锁. 还是回到上方两个疑问?
1回答
-
求老仙
2021-10-14
这个太细粒度了。 具体步骤不同JVM实现都可能有差异。 还是把精力重点理解这两个问题:为什么需要自旋竞争? 为什么需要waitset?上。
00
相似问题
回答 2
回答 1