
- 锁也分不同状态,JDK 6 之前只有两个状态:无锁、有锁(重量级锁)。
- JDK6之后对 synchronized 进行了优化,新增了两种状态,总共就是四个状态:无锁、偏向锁、重量级锁。
- 锁的类型和状态在对象头 Mark Word 中记录,在申请锁、锁升级等过程中JVM都需要读取对象的 Mark Word 数据。

synchronized 锁优化锁膨胀

锁有四种状态,并且会因实际情况进行膨胀升级,其膨胀方向是:无锁--> 偏向锁 --> 轻量级锁 --> 重量级锁,并且膨胀方向不可逆。

synchronized 锁优化偏向锁
- 减少线程获取锁的代价。在大多数情况下,锁不存在多线程竞争,总是由同一线程多次获得,那么此时就是偏向锁。
- 如果一个线程获得了锁,那么锁就进入偏向模式,此时 Mark Word 的结构也变为偏向锁结构。
- 当该线程再次请求锁时,无需再做任何同步操作,即获取锁的过程中只需要检查 Mark Word 的锁标记位为偏向锁以及当前线程 ID 等于 Mark Word 的 ThreadID 即可,这样就省去了大量有关锁申请的操作。
