轻量级锁的膨胀和自旋都发生在什么时机?
根据《深入理解java虚拟机第三版》中对于轻量级锁的描述
- 线程尝试获取锁时,会用cas的方式把锁对象头里的markword替换成指向当前线程栈帧中的lockrecord的指针,如果替换失败则会检查markword是否指向当前线程栈帧的lockrecord,如果不是则表示存在线程竞争,轻量级锁将膨胀为重量级锁。
我的疑问是:
这里cas失败后,并且markword没有指向当前线程栈帧的话,是不是会在这个时机开始自旋尝试cas替换markword来获取锁,自旋超过一定次数后锁才会膨胀?
- 线程释放锁时会用cas的方式把锁对象头里的markword中指向当前线程栈帧lockrecord的指针替换为displaced markword,如果替换失败则表示有其他线程尝试过获取该锁。
我的疑问是:
根据前面获取锁的机制来看,锁被占有期间,锁对象头的markword应该不会被其他线程通过cas替换掉吧?既然如此,为什么线程释放锁时会出现cas失败?而且还会以此判断有其他线程获取过锁?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
1)不会自旋
2)cas失败是因为此时锁已经被升级为重量级锁了
锁是有升级的,无锁,偏向锁,轻量级锁,重量级锁(申请操作系统的管程)。