进入到重量级锁后, 新进入的线程,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?上。 

0
0

笑傲Java面试 剖析大厂高频面试真题 秒变offer收割机

深度剖析大厂面试高频真题,让你秒变offer收割机

1783 学习 · 314 问题

查看课程