偏向锁和轻量级锁一样也是在JDK 1.6中新增的一种锁,它的目的是为了解决数据在无竞争的时候把同步语句去掉,进一步提高程序的运行性能。在上一篇中使我们知道轻量级锁是在无数据竞争的时,使用CAS操作去去掉同步的。那么在偏向锁中就是在无数据竞争时把整个同步都去掉,连CAS操作都不需要做了。偏向锁实际的本质是就是偏向第一个获得它的线程,当这个线程在执行时,如果该锁没有被其他的线程获取,则持有偏向锁的线程将一直不需要进行同步。下面我们看一下在线程获取偏向锁时,Mark Word都会有哪些变化。
当线程第一次获取锁时,虚拟机会把Mark Word中的标志位修改为01,即偏向模式。同时用CAS操作把获取到这个锁的线程记录在对象的Mark Word之中。如果CAS操作成功,那么持有偏向锁的线程每次在执行同步代码块时,虚拟机都不会进行任何同步操作。也就是不会调用同步相关的字节码指令等。当有其它线程尝试去获取这个锁时,偏向模式也就结束了。下图为偏向锁和轻量级锁转化时对象Mark Word等信息的变化。