轻量级锁的膨胀和自旋都发生在什么时机?

发布于 2022-09-12 02:37:37 字数 510 浏览 17 评论 0

根据《深入理解java虚拟机第三版》中对于轻量级锁的描述

  • 线程尝试获取锁时,会用cas的方式把锁对象头里的markword替换成指向当前线程栈帧中的lockrecord的指针,如果替换失败则会检查markword是否指向当前线程栈帧的lockrecord,如果不是则表示存在线程竞争,轻量级锁将膨胀为重量级锁。

我的疑问是:
这里cas失败后,并且markword没有指向当前线程栈帧的话,是不是会在这个时机开始自旋尝试cas替换markword来获取锁,自旋超过一定次数后锁才会膨胀?


  • 线程释放锁时会用cas的方式把锁对象头里的markword中指向当前线程栈帧lockrecord的指针替换为displaced markword,如果替换失败则表示有其他线程尝试过获取该锁。

我的疑问是:
根据前面获取锁的机制来看,锁被占有期间,锁对象头的markword应该不会被其他线程通过cas替换掉吧?既然如此,为什么线程释放锁时会出现cas失败?而且还会以此判断有其他线程获取过锁?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独木成林 2022-09-19 02:37:37

1)不会自旋
2)cas失败是因为此时锁已经被升级为重量级锁了

上课铃就是安魂曲 2022-09-19 02:37:37

锁是有升级的,无锁,偏向锁,轻量级锁,重量级锁(申请操作系统的管程)。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文