synchronize原理-对象头mark word对象大小(g
2020-10-26 本文已影响0人
胖达_4b7e
对象
public class L {
}
对象:
- 12字节的头
- 4字节 对齐填充 因为jvm以8字节的倍数 为一个slot 最小等我
加一个field int a;
没有变大, 刚好不用填充了
对象头
就是任意对象都要有的开头
如上文所述, 12字节, 就是96bit
后4字节 就是32bit , 指向所属class
mark word
8字节, 64位
hash
无锁 却不可偏向, 是因为 已经算了hash值了, 放了hash值就没地方放 偏向的线程id了,
不能偏向, 一来就是轻量锁, 因为轻量锁直接把原来的markword 放到抢到锁的线程的栈里面了, 就有地方放hash了
如果还没被当过锁, 就是还没偏向, 并且 么算过hash, 那么 那块就都是 0
是倒过来放的
这是小端模式 就是比如 int i=1, 实际存储是, 打印出来就感觉反了
unused
这25bit 永远是0
这bit也是
age
biased_lock 偏向标识
0不可偏向: 因为已经hash了
1可偏向(不一定是不是在偏向了)
↓ 加偏向锁以后 101(可偏向+现在是偏向锁)