偏向锁

偏向锁也是JDK6中引入的一项锁优化措施,它的目标是消除数据在无竞争

情况下的同步原语,进一步提高程序的运行性能。如果说轻量级锁是在无竞争

的情况下使用CAS操作去消除同步使用的互斥量,那偏向锁就是在无竞争的

情况下把整个同步都消除掉。

偏向锁即会偏向与第一个获得它的线程,该锁一直没被其他线程获取,则持有这个

偏向锁的线程将永远不需要再进行同步。

JDK6HotSpot虚拟机默认启动了偏向锁,可通过-XX:+UseBiasedLocking控制。

偏向锁过程

当锁对象第一次被线程获取的时候,虚拟机将会把对象头中的标识位设置为“01”、

把偏向模式设置为“1”,表示进入偏向模式。同时使用CAS操作把获取到这个锁

的线程ID记录在对象的Mark Word之中。如果CAS操作成功,持有偏向锁的线程

以后每次进入这个锁相关的同步块时,虚拟机都可以不再进行任何同步操作。

一旦出现另外一个线程去尝试获取这个锁的情况,偏向锁模式就马上结束,根据

锁对象目前是否处于被锁定的状态决定是否撤销偏向锁(偏向模式设置为“0”),

撤销后标志位恢复到未锁定(标志位为“01”)或轻量级锁定(标志位为“00”)的

状态,后续的同步操作按照轻量级锁的过程执行。