锁升级过程
jdk1.6之后的优化
synchronized锁有四种状态,无锁,偏向锁,轻量级锁,重量级锁,这几个状态会随着竞争状态逐渐升级,锁可以升级但不能降级,但是偏向锁状态可以被重置为无锁状态。
1、偏向锁
当一个线程获取锁时,会从锁对象的对象头立获取线程id和自己比较,如果是一致,就直接加锁,偏向锁它是适用于一个线程多次获得同一个锁的情况。如果有别的线程来竞争这把锁,需要升级成轻量级锁。
2、轻量级锁
轻量级锁就是线程在占有锁的时候,将锁对象的对象头复制一份到自己的栈帧中,然后使用CAS将锁对象头里的内容换成栈帧的地址。如果此时别的线程来抢锁但是没有抢到,就会一直自旋,当自旋次数达到上限/或者又有一个线程来抢锁,则会升级为重量级锁。
升级成重量级锁之后,重量级锁会把除了拥有锁的线程都阻塞掉,防止CPU空转。