Java并发14:synchronized的优化演进 - 从偏向锁到重量级锁
引言:synchronized为什么不慢了? 在JDK 1.5之前,synchronized被认为是"重量级锁",性能很差: // JDK 1.4时代 public synchronized void increment() { count++; // 即使无竞争,也要走完整的Monitor流程 } // 每次加锁/解锁都要陷入内核态,开销巨大 性能对比(JDK 1.4 vs JDK 1.8): JDK 1.4: 100万次synchronized: 约3000ms JDK 1.8: 100万次synchronized: 约50ms 性能提升60倍! 为什么提升这么大? 从JDK 1.6开始,HotSpot引入了锁优化技术: 偏向锁(Biased Locking) 轻量级锁(Lightweight Locking) 自旋锁(Spinning) 锁消除(Lock Elimination) 锁粗化(Lock Coarsening) 本篇文章将深入这些优化技术的原理和实现。 一、锁的四种状态 Java对象锁有4种状态,按级别从低到高: 无锁 → 偏向锁 → 轻量级锁 → 重量级锁 关键特性: 锁只能升级,不能降级(单向) 每种锁适用不同的竞争场景 1.1 Mark Word的锁状态 回顾Mark Word结构(64位JVM): 无锁状态 (001): ┌─────────────────────────────────────────────────────────────┐ │ unused(25) │ hashcode(31) │ unused(1) │ age(4) │ 0 │ 01 │ └─────────────────────────────────────────────────────────────┘ 偏向锁状态 (101): ┌─────────────────────────────────────────────────────────────┐ │ ThreadID(54) │ epoch(2) │ unused(1) │ age(4) │ 1 │ 01 │ └─────────────────────────────────────────────────────────────┘ 轻量级锁状态 (00): ┌─────────────────────────────────────────────────────────────┐ │ 指向栈中Lock Record的指针(62) │ 00 │ └─────────────────────────────────────────────────────────────┘ 重量级锁状态 (10): ┌─────────────────────────────────────────────────────────────┐ │ 指向Monitor对象的指针(62) │ 10 │ └─────────────────────────────────────────────────────────────┘ 锁状态判断: ...