在大多数情况下,锁不存在多线程竞争,而且往往是由一个线程多次获得,为了使线程获得锁的代价更低,引入了偏向锁。
工作原理
偏向锁,顾名思义,它会偏向最先获得它的线程,当一个线程访问同步代码块获得锁时,会在对象头和栈帧记录里存储锁偏向的线程ID,当这个线程再次进入同步代码块时,就不需要CAS操作来加锁了,只要测试一下对象头里是否存储着指向当前线程的偏向锁。如果测试成功,则表明该线程已经获得了锁,如果失败,则减产偏向锁的标示是否设为1,也就是当前是否是偏向锁,如果是,则尝试用CAS操作将对象头的偏向锁指向当前线程,如果不是,则用CAS竞争锁。
撤销
当有其他线程竞争偏向锁的时候,持有偏向锁的线程才会释放锁。当前持有偏向锁的线程如果处于不活动的状态,则直接将对象头设置为无锁状态;如果线程仍然活动,拥有偏向锁的栈会被执行,然后将锁偏向于其他线程,或者恢复到无锁状态。