SexyB0y
2021-01-20 23:40
采纳率: 33.3%
浏览 202
已采纳

shisynchronized关键字的锁在升级过程中,lock record是在什么时候生成的?

        看了些文章有些迷迷糊糊的,说法1:偏向锁在mark word里保存获取锁的线程ID时也会在线程栈帧里开辟一块空间保存lock record,此时的lock record值保存了获得锁的线程ID和一个owner指针,这个指针指向锁对象的mark word,且每次锁重入时都会重复生成lock record,且后续的lock record只保存了owner指针,而升级为轻量级锁时lock record保存的是mark word的备份和owner指针,在锁重入时也会重复生成只包含owner指针的lock record。

        说法2:是偏向锁被竞争锁的线程撤销并转为轻量级锁时才会生成lock record并进行mark word的拷贝。

        而我找到的官方的说法是:“When an object is lightweight locked by a monitorenter bytecode, a lock record is either implicitly or explicitly allocated on the stack of the thread performing the lock acquisition operation. ”这是否代表说法二是对的呢?还有就是关上文说法于lock record重复生成的说法是对的吗?这一块把我搞懵了,网上的文章说法都不一致,还有这篇文章

【Java并发004】原理层面:synchronized关键字全解析 - 微信公众号-标准Java - 博客园​www.cnblogs.com

        里面第五点提到重量级锁会降级为轻量级锁又是怎么回事呢?问题有点多很抱歉,希望大佬们能帮我解答一下,这些问题困扰我好几天了。

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • 纯白微风 2021-01-22 16:52
    已采纳

    《深入理解java虚拟机》原文:简单地介绍了对象的内存布局后,我们把话题返回到轻量级锁的执行过程上。在代码进入同步块的时候,如果此同步对象没有被锁定(锁标志位为“01”状态),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的Mark Word的拷贝(官方把这份拷贝加了一个Displaced前缀,即Displaced Mark Word);然后,虚拟机将使用CAS操作尝试将对象的Mark Word更新为指向Lock Record的指针。如果这个更新动作成功了,那么这个线程就拥有了该对象的锁,并且对象Mark Word的锁标志位(Mark Word的最后2bit)将转变为“00”,即表示此对象处于轻量级锁定状态

    lock record应该是线程进入同步代码时在无锁状态下产生的,记录的是锁对象的Mark Word的拷贝

    已采纳该答案
    打赏 评论
  • SexyB0y 2021-01-23 07:43

    感谢你的解答,那么是否可以理解为轻量级锁才会创建lock record呢?主要之前有坛友的文章说线程初次进入同步 代码块便已经进行了备份(指明单线程初次进入同步代码块)把我给整蒙了,官方的lightweight locked我也不确定是否就是指轻量级锁

    打赏 评论

相关推荐 更多相似问题