当前线程会先在对象头中记录自己,然后尝试用CAS将对象头中的锁记录替换为当前线程,如果成功就获取到锁,失败就进入阻塞队列等待唤醒。...其他线程要获取锁时,会发现对象头的锁定状态,也会进入内核态挂起。
当锁定的线程退出同步块时,会标记对象头为解锁状态,然后唤醒一个等待线程。...JMC中打开“标记对象(Mark Objects)”视图,可以观察到对象头的状态在变化:
初始为none状态,表示无锁
第一个线程进入同步块后变为biased状态,表示偏向锁定
多线程访问后变为轻量级锁...,对象头记录为线程ID
重入超过10次或持有超过1s后,变为重量级锁,对象头记录为锁定状态
当线程退出同步块后,可以观察到锁的释放过程
偏向锁会重置为none状态
轻量级锁使用CAS设置为unlocked...当偏向锁被不同线程获取超过20次,或轻量级锁被不同线程获取超过10次、或持有时间超过1s,Synchronized会进行锁升级。