Synchronized底层学习笔记
学习目标:
掌握 Synchronized关键字学习内容:
1、 Java的对象布局
2、Synchronized底层工作原理
3、Synchronized优化原理
学习时间:
20210206
学习产出:
synchronized关键字
上锁就是改变对象(LockTest.class) 的对象头
synchronized(LockTest.class){
for(int i = 0; i < 10; i++) {
}
}
Java的对象布局
1、对象头
2、实例变量
3、填充数据
JAVA对象的布局:
- 情况一:
1、对象头
2、实例变量
OFFSET SIZE TYPE DESCRIPTION VALUE
0 12 (object header) N/A
12 4 int L.i N/A
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
- 情况二:
1、对象头
2、实例变量
3、填充数据
OFFSET SIZE TYPE DESCRIPTION VALUE
0 12 (object header) N/A
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
- 小结:
情况一 | 情况二 |
---|---|
12 (object header) == 32bit*4 | 12 (object header) == 32bit*4 |
Instance size: 16 bytes | Instance size: 16 bytes |
4 int L.i | 4 (loss due to the next object alignment) |
对象存储在JVM的堆内存中,JVM每次在堆内存为对象开辟8byte倍数的空间。
- 什么是对象头?—— >
对象的第一部分所有对象的公共部分
存储了对象的布局、类型、GC状态、同步状态、标识哈希码等基本信息 - Java对象头由什么组成?
Mark Metadata 64bit
Class Metadata Address/klass pointer 32bit
计算HashCode: