知识卡片

锁会逐级膨胀

普通读书笔记卡 · 1509.a

内容

这是 JDK 1.6 引入、只在旧版 HotSpot 有效的机制:内置锁从无锁、偏向锁、轻量级锁到重量级锁只能升级不能降级——无竞争偏向单线程,出现竞争升级为轻量级锁自旋等待,超时仍抢不到才膨胀为重量级锁阻塞。版本边界:偏向锁 JDK 15 起默认禁用,是特定历史阶段的 JVM 实现,非语言规范承诺。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第2章《Java内置锁的核心原理》2.4.5节《无锁、偏向锁、轻量级锁和重量级锁》(源文件:_epub-src/OEBPS/Text/chapter74.xhtml);版本边界核对自 [JEP 374 实现记录](https://bugs.openjdk.org/browse/JDK-8231265)(偏向锁默认禁用并弃用相关选项)。 - 结论依据:原文说明 JDK 1.6 之前内置锁全是重量级锁,JDK 1.6 引入偏向锁和轻量级锁后“状态随着竞争情况逐渐升级”“可以升级但不能降级”,并描述了从偏向到轻量级(自旋)再到重量级(阻塞)的触发条件;结合 JEP 374 记录偏向锁在现代 HotSpot 默认禁用的事实,可以推出这是版本化的历史机制而非当前必然行为。 - 原始内容:在JDK 1.6版本之前,所有的Java内置锁都是重量级锁……JDK 1.6版本为了减少获得锁和释放锁所带来的性能消耗,引入了偏向锁和轻量级锁的实现……内置锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能再降级成偏向锁。