synchronized在JDK6后的优化
请说明JDK6对synchronized进行的性能优化(锁升级、锁粗化、锁消除、自适应自旋)的原理。
回答
我还是少年
1. 锁升级(偏向锁→轻量级锁→重量级锁)
- 同一线程多次获取同一个锁无需同步(偏向锁)。
- 少量线程竞争时自旋获取(轻量级锁)。
- 竞争激烈时挂起线程(重量级锁)。
- 不可逆:只能从轻到重,不能降级。
2. 锁粗化(Lock Coarsening)
- 将连续多个加锁/解锁操作合并为一个更大的锁范围。
- 示例:循环内的加解锁操作合并为循环外加锁。
3. 锁消除(Lock Elimination)
- JIT通过逃逸分析,发现锁对象不会逃逸出线程时消除所有同步。
- 示例:局部变量StringBuffer的append操作,锁被消除。
4. 自适应自旋(Adaptive Spinning)
- JVM根据上次锁自旋成功率动态调整自旋次数。
- 成功率高→自旋次数增加。
- 成功率低→减少或取消自旋。
这些优化使得synchronized在大多数场景下性能与ReentrantLock相当。