知识卡片
对象头承载锁态
内容
synchronized 的运行状态依附在 Java 对象头的 Mark Word 字段中:这段与 JVM 位数等长的存储区用最低几位标记锁状态(无锁/偏向锁/轻量级锁/重量级锁),并按状态复用同一空间存不同信息——偏向锁存持锁线程 ID,轻量级锁存栈帧锁记录指针,重量级锁存监视器指针。理解对象头才能理解为什么同一个 synchronized 在无竞争和激烈竞争下开销完全不同。
参考来源
- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第2章《Java内置锁的核心原理》2.4.1节《Java对象结构》、2.4.2节《Mark Word的结构信息》(源文件:_epub-src/OEBPS/Text/chapter70.xhtml、chapter71.xhtml)
- 结论依据:原文指出对象头的 Mark Word 字段“用于存储自身运行时的数据,例如GC标志位、哈希码、锁状态等信息”,且其结构“与Java内置锁的状态强相关”,不同锁状态下复用同一段二进制位存不同字段(线程ID、锁记录指针、监视器指针等),因此可以推出 synchronized 的运行状态依附于对象头、成本随锁状态变化的结论。
- 原始内容:Mark Word(标记字)……用于存储自身运行时的数据,例如GC标志位、哈希码、锁状态等信息……Mark Word字段的结构与Java内置锁的状态强相关……JVM将Mark Word最低两个位设置为Java内置锁状态位。