【Java并发编程之深入理解】对象锁

Java的对象头通常由两个部分组成,一个是Mark Word存储对象的hashCode或者锁信息,另一个是Class Metadata Address用于存储对象类型数据的指针,如果对象是数组,还会有一个部分存储的是数据的长度。

java对象头的长度:
【Java并发编程之深入理解】对象锁
对象头里的Mark Word里默认存储对象的HashCode、分代年龄和锁标记位。

32位JVM的Mark Word的默认存储结构为:
【Java并发编程之深入理解】对象锁
在运行期间,Mark Word里存储的数据会随着锁标志位的变化而变化。Mark Word可能变化为存储以下4种数据:
【Java并发编程之深入理解】对象锁
64位JVM的Mark Word的默认存储结构为:
【Java并发编程之深入理解】对象锁

多个线程来访问对象时锁的状态变化

偏向锁初始化流程:
【Java并发编程之深入理解】对象锁

两个线程同时争夺锁,导致锁膨胀的流程图:
【Java并发编程之深入理解】对象锁

参考资料:Java并发编程的艺术