标签:分配 monitor eth 没有 image 逻辑 系统 长度 term
真正存储的有效信息,也就是定义的各种字段名称啦,父类子类的都有,相同宽度的字段总是分配到一起。
没什么作用,仅仅是起着占位符的作用。
1.我们先来看一个对象头的数据图,其中synchronized是指重量级锁,图中的指针指向一个monitor对象,也就是著名的对象监视器啦!
<1>定义:它是对象监视器,由虚拟机创建,底层是由ObjectMonitor实现的。
<2>和锁lock的联系:锁在逻辑上,也就是对象头里面的标记位,加锁就是把标记位改为相应的值,monitor是jvm实现锁的方式,当线程持有监视器时,肯定时加锁成功了,而监视器(monitor)是依赖于底层的操作系统的Mutex Lock来实现的。
<3>实现原理:
Monitor中有两个队列,entry-set和wait-set,当多个线程访问一段同步代码后,它先进入entry-set,等获取对象的monitor(monitorenter指令)后进入监视区域,同时monitor中的计数器加1,调用wait 方法时会将计数器-1进入wait-set。
反编译后发现,是通过两条指令:entermonitor 和leavemonitor ,前者进入监视器,持有它,计数器从0加到1.后者将计数器减1,释放监视器,产生异常时,也会执行monitorexit来释放monitor。
JVM可以从方法常量池中的方法表结构(method_info Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法,如果是,则会先持有monitor。也就是加锁成功。
标签:分配 monitor eth 没有 image 逻辑 系统 长度 term
原文地址:https://www.cnblogs.com/JimmyFanHome/p/9918254.html