理解java 对象头
在JVM中,对象存活在堆中。对象包含2块数据。
对象 |
---|
对象头 |
实例变量 |
padding(小8个字节,仅做补齐用) |
而这个对象头包含3块数据。
对象头 |
---|
mark word |
class meta address 指向方法区 表示这具体什么类 |
array length 如果对象是数组,表示数组的长度 |
mark word 状态 。长度由操作系统位数32/64决定的
1.Unlocked 未锁定
2. Biased偏向锁
3. Light-weight locked 轻量级锁
4. heavy-weight locked重量级锁
轻量级锁。
- 进入临界代码块,监视对象是不是无锁状态(锁位标志是不是01)。不是01,直接升级为重量级锁。
- 当前线程操作栈创建一个栈帧 锁记录(Lock record),复制对象Object的mark word的拷贝。 称做displaced mark word。
- 执行CAS操作 ,虚拟机尝试将对象Object的mark word 指向Lock record。owner 字段指向到 Object 的mark word,引用互相指向。 如果更新成功则执行step4,失败则执行step5.
- 此时线程拥有该对象的锁,并且Object mark word 锁标志位更新成00.表示对象处于轻量级锁定状态。
- 由于对象Object的mark word 已经被修改,抢锁失败。自旋一定次数之后,锁升级成重量级锁。