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

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

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

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


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

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

阅读 2.6k
2 个回答

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

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

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