<!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core -->
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.9</version>
</dependency>
package learn.cn.多线程;
/**
* create by liuzhiwei on 2020/4/2
*/
public class JavaObjectHead {
//boolean flag;//1 byte
int flag;//4 byte
}
package learn.cn.多线程;
import org.openjdk.jol.info.ClassLayout;
/**
* create by liuzhiwei on 2020/4/2
* Java对象头 64位虚拟机
* <p>
* 对象头 mark word 4Byte 32bits 实际上 12byte=96bit 周志明第二版2008年出版的(32位虚拟机)
* mark word (64bit) + klass pointer/Class MetaData address(32bit/64bit(无压缩) = 12Byte
* <p>
* 实例变量
* 对齐填充
* 8Bytes 的倍数
* <p>
* 哈希码 GC标记 GC次数 同步锁标记 偏向锁持有者
* <p>
* synchronized对象状态
* 无状态
* 偏向锁
* 轻量锁
* 重量锁
* gc标记
*/
public class JavaObjectHeadTest {
public static void main(String[] args) {
JavaObjectHead head = new JavaObjectHead();
System.out.println(head.hashCode());//大端小端存储
System.out.println(Integer.toHexString(head.hashCode()));//大端小端存储
System.out.println(ClassLayout.parseInstance(head).toPrintable());
synchronized (head) {
System.out.println("加锁");
}
}
}
1.3.jar:/Users/liuzhiwei/.m2/repository/org/openjdk/jol/jol-core/0.9/jol-core-0.9.jar learn.cn.多线程.JavaObjectHeadTest
1725154839
66d3c617
# WARNING: Unable to attach Serviceability Agent. You can try again with escalated privileges. Two options: a) use -Djol.tryWithSudo=true to try with sudo; b) echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
learn.cn.多线程.JavaObjectHead object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 01 17 c6 d3 (00000001 00010111 11000110 11010011) (-741992703)
4 4 (object header) 66 00 00 00 (01100110 00000000 00000000 00000000) (102)
8 4 (object header) 43 c1 00 f8 (01000011 11000001 00000000 11111000) (-134168253)
12 4 int JavaObjectHead.flag 0
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
加锁
Process finished with exit code 0
Synchronized锁对象 普通对象 类对象
Synchronized(Object) 不能用String Long Integer 常量 Object 为null
可重入 父子类
独占锁
悲观锁
锁升级(对象头 markword)
- 无锁
- 偏向锁:第一个线程 偏向第一个线程
如果有多个线程竞争的时候升级为轻量级锁
可以关闭偏向锁,默认开启 -XX:+UseBiasedLocking
关闭偏向锁- 轻量级 自旋锁(CAS 自旋10次 消耗cpu计算资源): (加锁代码)执行时间短 线程数少 lockrecord 将markword 复制到lockrecord
- 重量级锁(操作系统内核锁 排队 不消耗cpu计算资源): 执行时间长 线程数多