属于jdk1.6优化手段,jdk1.6之前都是传统的重量级锁实现方式,优化后
如果程序运行期间永远是单线程,则只使用到偏向锁阶段,但是假如有第二,三个不同的线程介入,则升级为轻量级锁,如果这些线程只是交替有序的进行,则保持在轻量级阶段,一旦发生了并发冲突,则升级为重量级锁阶段。重量级锁阶段会先通过自旋或者自适应自旋方式等待锁释放,超过自旋次数就借助底层系统级别的mutex互斥锁,这需要从用户态进入内核态,发生上下文切换,性能损失较大。之所以做这些优化,就是为了尽量避免使用底层系统调用。
具体实现上,偏向锁,基于对象头,mark word。对象头存储3部分信息,mark word,类指针,和数组长度(如果是数组)。
轻量级锁,基于线程栈存储的Lock Record。和cas比较实现。
重量级锁,基于自旋和系统调用实现。