偏向锁
首先我们了解一下对象头MarkWord结构
后面的lock 分别对应着对象的不同状态, 注意:正常状态和偏向锁都是01结尾,但是偏向锁的倒数第三位是1,正常的是0,偏向锁前面存储的偏向线程id和时间戳
下面是对象MarkWord不通状态存储的不同信息
在我们使用synchronized包裹临界区代码块时访问MarkWord中偏向锁的标识是否设置成1,锁标志位是否为01,确认为可偏向状态。如果为可偏向状态,则测试线程ID是否指向当前线程,如果是就执行synchronized包裹的代码,对比轻量级锁,他减少了CAS操作锁记录替换锁对象的MarkWord的操作和储存一个指针指向锁对象的操作,减少了执行步骤提高了执行效率,但是一旦有其他线程来获取该锁对象,但是没有资源竞争的情况,锁就会自动升级为轻量级锁,如果随即发生了资源竞争的情况锁就会升级为重量级锁
自旋优化
重量级锁在相互竞争的时候,线程先会进入一个自旋,如果当前线程自旋期间成功的获得了锁,那么就避免了当前线程阻塞,避免了上下文切换,因为上下文切换是非常慢的,非常耗费性能
自旋成功的情况
失败情况