JAVA锁的理解--待补充
轻量级锁与重量级锁的性能差异主要体现在锁竞争的激烈程度和线程阻塞 / 唤醒的开销上。虽然轻量级锁在等待时会自旋,但它避免了线程上下文切换的成本,因此在特定场景下性能更优。以下是详细对比:
-
轻量级锁的工作原理
适用场景:线程交替执行同步块,几乎无锁竞争(如单线程重复进入同步块)。
自旋机制:当锁被占用时,线程不阻塞,而是通过循环(自旋)尝试获取锁,避免了线程切换的开销。
优点:如果锁很快被释放,自旋等待的时间成本远低于线程阻塞 / 唤醒的开销。
缺点:若锁竞争激烈,长时间自旋会消耗 CPU 资源(相当于 CPU 空转)。 -
重量级锁的工作原理
适用场景:锁竞争激烈,多个线程频繁争夺同一锁。
阻塞机制:当锁被占用时,线程会被挂起(进入内核态),等待锁释放后被唤醒(需从内核态切换回用户态)。
优点:不消耗 CPU 资源,适合长时间持锁的场景。
缺点:线程切换涉及内核态与用户态的转换,性能开销大(通常需要几十微秒甚至更长)。 -
性能差异对比
场景 轻量级锁(自旋) 重量级锁(阻塞)
无竞争或短时间竞争 ✅ 几乎无开销(仅自旋几次) ❌ 线程切换开销大(内核态转换)
长时间竞争 ❌ 自旋消耗大量 CPU 资源 ✅ 线程休眠不消耗 CPU
上下文切换成本 无(用户态完成) 高(内核态参与)
典型应用 同步块执行速度快(如 getter/setter) 同步块执行时间长(如 IO 操作)
总结
轻量级锁适合无竞争或短时间竞争的场景,通过避免线程切换提升性能。
重量级锁适合长时间竞争的场景,通过线程阻塞避免 CPU 空转。
JVM 优化:现代 JVM 会根据锁竞争情况自动在轻量级锁和重量级锁之间切换(如自旋超过一定次数后升级为重量级锁)。
因此,轻量级锁并非 “始终优于” 重量级锁,而是在特定场景下通过减少线程切换来提升性能。

浙公网安备 33010602011771号