当线程A获取了偏向锁以后,有线程B尝试获取偏向锁,无论此时线程A有没有离开临界区,一定会进入偏向锁撤销流程,撤销流程中将会判定是否撤销偏向锁。其中要进行判定的话必须先要等待到达全局安全点(safe point),那问题就是,从撤销流程开始,到全局安全点之间的这段时间里:
1.线程B是处于什么状态?(既然线程B没获取到锁,应该是不会继续运行的吧?而偏向锁又不会让线程阻塞)
2.线程A会不会再次进入临界区?
我当前的理解是撤销流程开始后并不会立即到达全局安全点,期间会有一段时间间隔,不知道对不对
当线程A获取了偏向锁以后,有线程B尝试获取偏向锁,无论此时线程A有没有离开临界区,一定会进入偏向锁撤销流程,撤销流程中将会判定是否撤销偏向锁。其中要进行判定的话必须先要等待到达全局安全点(safe point),那问题就是,从撤销流程开始,到全局安全点之间的这段时间里:
1.线程B是处于什么状态?(既然线程B没获取到锁,应该是不会继续运行的吧?而偏向锁又不会让线程阻塞)
2.线程A会不会再次进入临界区?
我当前的理解是撤销流程开始后并不会立即到达全局安全点,期间会有一段时间间隔,不知道对不对
15 回答8.4k 阅读
8 回答6.2k 阅读
4 回答4.4k 阅读✓ 已解决
4 回答4k 阅读
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
没有细研究过,但我猜和GC时的要求进入safepoint应该是类似的。
1.线程B当然还是RUNNABLE状态,线程B会向VMTread提交要求进入safepoint的任务,然后等待返回,类似于GC线程要求其他线程进入safepoint之后他再工作
2.线程A会不会再次进入临界区不好说,得看要求检测safepoint的时机