1. 对象刚new出来
默认会上轻量级锁,因为偏向锁有个时延,默认是4秒
JDK 默认对象头是无锁的,JDK11 打开就是偏向锁
2. 如果有线程上锁,偏向锁
如果有线程第一次上锁,会上偏向锁
偏向锁的过程,就是将自己线程的 id 值写到对象头 markword 上
不需要竞争,这把锁就是偏向第一个线程的
下一次同一个线程上锁的时候,不需要竞争,只要看到对象头的线程id是自己的,就可以使用
当线程销毁时,偏向锁降级为无锁。
偏向锁的意义
类似Vector、HashTable、StringBuffer 这些类,方法上都写了sync,需要加锁
但很多情况下都没有其他的线程来竞争,都是单线程在运行他们
因此每当线程来的时候就竞争,效率太低,这就是偏向锁存在的意义
3. 如果有线程竞争锁,轻量级锁
如果有线程来竞争锁,会撤销偏向锁,升级为轻量级锁
线程在自己的线程生产 lockRecord,基于CAS,尝试将 markword 设置位指向自己线程的 LR 指针。设置成功的,得到锁。设置失败的,原地自旋
如果竞争加剧,升级为重量级锁
自旋超过10次
自旋线程数量达到CPU 核数的一半