锁升级过程 无锁——》偏向锁——》自旋锁——》重量级锁
1、刚开始无锁;
2、来一个线程的时候锁升级为偏向锁(记录线程号--当前线程指针);
3、再来一个线程竞争,撤销偏向锁;锁升级为轻量级锁(自旋锁、无锁)---》指向线程栈中 Lock Record 的指针,通过CAS方式竞争锁 谁先把自己的 Lock Record指针贴上去,谁先获取锁;另外一个线程一直自旋等待
4、有线程超过10次自旋或自旋线程数超过CPU核数的一半,自动升级为重量级锁;jdk1.6之后 jvm自己控制升级为重量级锁。
5、无锁——》偏向锁——》轻量级锁 升级都是 用户态;随着自旋锁一直等待,会消耗cpu,所以会继续升级为重量级锁(获取到重量级锁的线程会进入等待队列,避免消cpu),用户态到内核态的过程