我们Java程序员编码时谈论的最多的两个字就是对象,Java中几乎所有的技术都是围绕对象展开。本文将要讲述的Monitor并不是Java对象,而是在操作系统中关联的“对象”,Monitor是Java重量级锁synchronized实现的关键,因此学习Java单机同步机制就离不开对Monitor的剖析。Monitor从Java层面经常被人们称为监视器锁,而在操作系统层面称为管程。
Monitor与Java对象头相关联,因此剖析Monitor之前必须了解Java对象的组成结构。Java对象在内存中由三部分组成,分别是对象头、实例数据、对齐填充。以32位虚拟机为例(64位不同),对象头(Header)占8个字节共64位(数组对象头与普通对象头不同,数组对象头12个字节共96位);实例数据(Instance Data)存储这对象的实际数据,因此大小与实际数据大小一致;对齐填充(Padding)是可选项,用于将内存对齐为8字节的整数倍。
如上两张图展示了Java对象内存结构,本文说的Monitor和这个有啥关系呢?其实对象头(Header)中的Mark Word就是用来存放Monitor对象的指针的,在一开始小捌就说了Monitor并不是Java对象,而是在操作系统中关联的“对象”,因此Java对象如果想要和Monitor进行关联,就必须在Java对象中记录Monitor的内存地址,这样才能通过Java对象找到这个Monitor嘛!
注:Klass Word存放的是指向对象对应的Class对象的指针。