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

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

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

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


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

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

阅读 337
评论
    2 个回答

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

      • 488

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

        撰写回答

        登录后参与交流、获取后续更新提醒