根据《深入理解java虚拟机第三版》中对于轻量级锁的描述
- 线程尝试获取锁时,会用cas的方式把锁对象头里的markword替换成指向当前线程栈帧中的lockrecord的指针,如果替换失败则会检查markword是否指向当前线程栈帧的lockrecord,如果不是则表示存在线程竞争,轻量级锁将膨胀为重量级锁。
我的疑问是:
这里cas失败后,并且markword没有指向当前线程栈帧的话,是不是会在这个时机开始自旋尝试cas替换markword来获取锁,自旋超过一定次数后锁才会膨胀?
- 线程释放锁时会用cas的方式把锁对象头里的markword中指向当前线程栈帧lockrecord的指针替换为displaced markword,如果替换失败则表示有其他线程尝试过获取该锁。
我的疑问是:
根据前面获取锁的机制来看,锁被占有期间,锁对象头的markword应该不会被其他线程通过cas替换掉吧?既然如此,为什么线程释放锁时会出现cas失败?而且还会以此判断有其他线程获取过锁?
1)不会自旋
2)cas失败是因为此时锁已经被升级为重量级锁了