JVM 对象信息 和 sychronize 底层原理

  在JVM中,对象是分成三部分存在的:对象头、实例数据、对其填充。

      

  实例数据存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐;

  对其填充不是必须部分,由于虚拟机要求对象起始地址必须是8字节的整数倍,对齐填充仅仅是为了使字节对齐。

 

  对象头是我们需要关注的重点,它是synchronized实现锁的基础,因为synchronized申请锁、上锁、释放锁都与对象头有关。

  对象头主要结构是由Mark Word  Class Metadata Address组成,

    其中Mark Word存储对象的hashCode、锁信息或分代年龄或GC标志等信息,

    Class Metadata Address是类型指针指向对象的类元数据,

    JVM通过该指针确定该对象是哪个类的实例。

 

  锁也分不同状态,JDK6之前只有两个状态:无锁、有锁(重量级锁),而在JDK6之后对synchronized进行了优化,新增了两种状态,总共就是四个状态:无锁状态、偏向锁、轻量级锁、重量级锁,其中无锁就是一种状态了。

  锁的类型和状态在对象头Mark Word中都有记录,在申请锁、锁升级等过程中JVM都需要读取对象的Mark Word数据。

 

  每一个锁都对应一个monitor对象,在HotSpot虚拟机中它是由ObjectMonitor实现的(C++实现)。

  每个对象都存在着一个monitor与之关联,对象与其monitor之间的关系有存在多种实现方式,如monitor可以与对象一起创建销毁或当线程试图获取对象锁时自动生成,但当一个monitor被某个线程持有后,它便处于锁定状态。

 

    Synchronized的语义底层是通过一个monitor的对象来完成,其实wait/notify等方法也依赖于monitor对象,这就是为什么只有在同步的块或者方法中才能调用wait/notify等方法,否则会抛出

java.lang.IllegalMonitorStateException的异常的原因。

 

参考 : https://www.cnblogs.com/aspirant/p/11470858.html

posted @ 2021-10-24 18:01  抽象Java  阅读(86)  评论(0编辑  收藏  举报