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实现原理的主要内容,如果未能解决你的问题,请参考以下文章

初学Java多线程:使用Synchronized块同步方法

synchronized原理是啥?

并发技术12线程锁技术的使用

synchronized实现原理

synchronized关键字以及对象锁和类锁的区别

synchronized 实现原理