Synchronized实现原理
Posted jimmyfanhome
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Synchronized实现原理相关的知识,希望对你有一定的参考价值。
一.对象的内存布局
1.对象头
-
- 存储对象自身的运行时数据,如哈希码,GC分代年龄,锁状态标志,偏向线程ID,官方称为Mark Word。
- 类型指针,虚拟机通过这个指针来确定这个对象是哪一个类的实例。
- 记录数组长度的数据,不是数组时没有。
2.实例数据
真正存储的有效信息,也就是定义的各种字段名称啦,父类子类的都有,相同宽度的字段总是分配到一起。
3.对齐填充
没什么作用,仅仅是起着占位符的作用。
二.对象头解析
1.我们先来看一个对象头的数据图,其中synchronized是指重量级锁,图中的指针指向一个monitor对象,也就是著名的对象监视器啦!
2.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。
三.synchronized的实现原理
1.同步代码块
反编译后发现,是通过两条指令:entermonitor 和leavemonitor ,前者进入监视器,持有它,计数器从0加到1.后者将计数器减1,释放监视器,产生异常时,也会执行monitorexit来释放monitor。
2.同步方法
JVM可以从方法常量池中的方法表结构(method_info Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法,如果是,则会先持有monitor。也就是加锁成功。
以上是关于Synchronized实现原理的主要内容,如果未能解决你的问题,请参考以下文章