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。也就是加锁成功。

posted @ 2018-11-06 21:22  AJimmyFang  阅读(586)  评论(0编辑  收藏  举报