Java中偏向锁问题

我实在是弄的有点头大, 而且网上找资料大多都是复制黏贴,或者说得不是很详细, 所以才来提问.

我有以下几个问题.

  1. 同步代码块/方法 执行完成后线程会主动释放锁, 那么会主动释放偏向锁吗?
  2. 重偏向网上说, 当 epoch 失效后会重偏向. 那么 epoch 是如何失效的?
  3. 我在美团关于锁的文章(偏向锁)中看到下面两句话:
    1). 偏向锁只有遇到其他线程尝试竞争偏向锁时, 持有偏向锁的线程才会释放锁, 线程不会主动释放偏向锁.
    2). 偏向锁的撤销, 需要等待全局安全点 (在这个时间点上没有字节码正在执行), 它会首先暂停拥有偏向锁的线程, 判断锁对象是否处于被锁定状态.
    如果只是第一句话还是好理解的. 关键是第二句, 我在网上查的偏向锁的撤销流程是, 在 https://www.loongzee.com/2019/04/11/JavaSynchronized_1/ 这篇文章中的 **下面将依据偏向锁的流程进行介绍,如下图所示:** 说明的.

    我对于释放偏向锁和撤销偏向锁的理解是, 偏向锁撤销后, 判断之前线程是否存活, 如果存活会释放偏向锁并撤销为轻量锁, 否则还是会释放上一个线程的偏向锁.

请小哥哥 小姐姐们 不要笑话我, 帮我解答解答, 有资料的话 我也可以自己看.

@捏造的信仰

阅读 2.5k
1 个回答
  1. 当然
  2. 发生批量重偏向时,class的epoch+1
  3. 1). 偏向锁只有遇到其他线程尝试竞争偏向锁时, 持有偏向锁的线程才会释放锁, 线程不会主动释放偏向锁.

并不是,偏向锁是会释放的,只不过他是释放了lock record的,并没有改回偏向线程ID,造成没有释放锁的假象

我当时看的是下面这个源码分析的博文,相当的硬核,当时就看的云里雾里,现在也忘得差不多了
https://github.com/farmerjohngit/myblog/issues/12

我只记得网上的资料都是以文字理解然后不断的被人用文字描述重加工,所以很多内容都是错的,和源码根本不是一回事儿。

最后这个synchronize内容真的很硬核(官方给了太多的优化导致其他人的学习成本很高),比Lock难懂太多(可能和是c++写的有关,看不懂)。

随便看看吧,研究的目的还是因为实际需要,如果用不上的话没必要那么较真了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题