码迷,mamicode.com
首页 > 其他好文 > 详细

Synchronized实现原理

时间:2018-11-06 22:28:34      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:分配   monitor   eth   没有   image   逻辑   系统   长度   term   

一.对象的内存布局

  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实现原理

标签:分配   monitor   eth   没有   image   逻辑   系统   长度   term   

原文地址:https://www.cnblogs.com/JimmyFanHome/p/9918254.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!