CodeWalk

synchronized在JDK6后的优化

作者:我还是少年 · 2026-05-30 12:55

请说明JDK6对synchronized进行的性能优化(锁升级、锁粗化、锁消除、自适应自旋)的原理。

回答

我还是少年

1. 锁升级(偏向锁→轻量级锁→重量级锁)

  • 同一线程多次获取同一个锁无需同步(偏向锁)。
  • 少量线程竞争时自旋获取(轻量级锁)。
  • 竞争激烈时挂起线程(重量级锁)。
  • 不可逆:只能从轻到重,不能降级。

2. 锁粗化(Lock Coarsening)

  • 将连续多个加锁/解锁操作合并为一个更大的锁范围。
  • 示例:循环内的加解锁操作合并为循环外加锁。

3. 锁消除(Lock Elimination)

  • JIT通过逃逸分析,发现锁对象不会逃逸出线程时消除所有同步。
  • 示例:局部变量StringBuffer的append操作,锁被消除。

4. 自适应自旋(Adaptive Spinning)

  • JVM根据上次锁自旋成功率动态调整自旋次数。
  • 成功率高→自旋次数增加。
  • 成功率低→减少或取消自旋。

这些优化使得synchronized在大多数场景下性能与ReentrantLock相当。