SexyB0y 2021-01-20 23:40 采纳率: 50%
浏览 412
已采纳

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条回答 默认 最新

  • 纯白微风<alert> 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的拷贝

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b