偏向锁
偏向锁也是JDK6
中引入的一项锁优化措施,它的目标是消除数据在无竞争
情况下的同步原语,进一步提高程序的运行性能。如果说轻量级锁是在无竞争
的情况下使用CAS
操作去消除同步使用的互斥量,那偏向锁就是在无竞争的
情况下把整个同步都消除掉。
偏向锁即会偏向与第一个获得它的线程,该锁一直没被其他线程获取,则持有这个
偏向锁的线程将永远不需要再进行同步。
JDK6
起HotSpot
虚拟机默认启动了偏向锁,可通过-XX:+UseBiasedLocking
控制。
偏向锁过程
当锁对象第一次被线程获取的时候,虚拟机将会把对象头中的标识位设置为“01”、
把偏向模式设置为“1”,表示进入偏向模式。同时使用CAS
操作把获取到这个锁
的线程ID记录在对象的Mark Word
之中。如果CAS
操作成功,持有偏向锁的线程
以后每次进入这个锁相关的同步块时,虚拟机都可以不再进行任何同步操作。
一旦出现另外一个线程去尝试获取这个锁的情况,偏向锁模式就马上结束,根据
锁对象目前是否处于被锁定的状态决定是否撤销偏向锁(偏向模式设置为“0”),
撤销后标志位恢复到未锁定(标志位为“01”)或轻量级锁定(标志位为“00”)的
状态,后续的同步操作按照轻量级锁的过程执行。