|--------------------------------------------------------------| | Object Header (64 bits) | |------------------------------------|-------------------------| | Mark Word (32 bits) | Klass Word (32 bits)(这个可以找到对象) | |------------------------------------|-------------------------|二、数组对象
|---------------------------------------------------------------------------------| | Object Header (96 bits) | |--------------------------------|-----------------------|------------------------| | Mark Word(32bits) | Klass Word(32bits) | array length(32bits) (数组长度)| |--------------------------------|-----------------------|------------------------|三、其中 Mark Word 结构为
64 位虚拟机 Mark Word
二、Monitor(锁)
Monitor被翻译为监视器或管程
每个java对象都可以关联一个Monitor对象,如果使用synchronized给对象上锁(重量级)之后
执行过程:
1、当一个线程进入加了synchronized关键字的代码块,或锁(锁的其实是对象)后,首先,obj这个对象的对象头中的MarkWord部分会有所改变
,这个改变就是会与系统提供的monitor对象相关联,关联成功mark word就会从无锁变为有锁状态。
2、之后Monitor对象里面的属性Owner就会记录这个线程,表示这个线程是这把锁的主人。
3、以后的线程再请求加锁的代码块时,就会先检查obj这个对象有没关联锁,一检查就会发现已经关联了一个锁,然后这个线程就会与Monitor的EntryList属性进行关联,线程变为阻塞状态。之后来的线程都会与这个属性关联。底层是链表结构。
4、当线程2执行完synchronized代码块之后, 就会释放里面的锁。线程1与线程3就会竞争,获得锁之后又会执行线程2的过程
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)