1.java中有那些锁?
synchronized锁:
上锁就是改变对象布局的对象头
对象布局(java对象有什么组成):
在HotSpot虚拟机中,实例对象在内存中存储的布局可以分为三块区域:对象头,实例数据,和对齐填充。
-
对象头(64位虚拟机为例)
右侧红色区域表示对象的五种状态
-
无状态(对象刚new出来的时候,无状态)
-
偏向锁状态
-
轻量锁
-
重量锁
-
gc标记
1)第一部分用于存储对象自身运行时数据Mark word(哈希码,分代年龄,锁状态标志,线程持有实例,偏向线程ID,偏向时间戳等),这就是Mark Word部分,占64bit
2)第二部分是指向类的指针,即Class Metadata Address(klass pointer),对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。占32bit(jvm开启指针压缩后占32bit,未开启指针压缩占64bit)。
如果对象是一个数组,在头对象中还必须有一块用于记录数组长度的数据。
- 实例数据
存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。 - 对齐填充
由于虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐。
/*
- byte 1byte = 8bit
- short 2byte = 16bit
- char 2byte = 16bit
- int 4byte = 32bit
- long 8byte = 64bit
- float 4byte = 32bit
- double 8byte = 64bit
- boolean 1byte = 8bit
*/
打印对象头部信息依赖
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.8</version>
</dependency>