深入理解synchronized(简记)

管程synchronized

Java 参考了 MESA 模型,语言内置的管程(synchronized)对 MESA 模型进行了精简。

在这里插入图片描述

对象的内存布局

  • 对象头
    • MarkWord(记有锁标记) 8字节
    • 压缩指针 4字节
  • 实例数据 (xx)字节
  • 对齐填充 8的整倍数

使用JOL工具查看内存布局

<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.4</version>
</dependency>

锁状态记录

锁状态

锁对象状态转换


偏向锁

  • 偏向锁延迟机制:HotSpot 虚拟机在启动后有个 4s 的延迟才会对每个新建的对象开启偏向锁模式。JVM启动时会进行一系列的复杂活动,比如装载配置,系统类初始化等等。在这个过程中会使用大量synchronized关键字对对象加锁,且这些锁大多数都不是偏向锁。为了减少初始化时间,JVM默认延时加载偏向锁。

  • 偏向锁撤销之调用对象HashCode

    偏向锁无法储存HashCode

    1.调用HashCode,偏向锁变为无锁态

    //jvm延迟偏向
    Thread.sleep(5000);
    Object obj = new Test();
    obj.hashCode();
    //查看对象内部信息
    System.out.println(ClassLayout.parseInstance(obj).toPrintable());
    

    2.调用HashCode,偏向锁将升级成重量锁

    new Thread(()->{
      synchronized (obj){
          obj.hashCode();
          System.out.println(Thread.currentThread().getName()+"\n"+ClassLayout.parseInstance(obj).toPrintable());
      }
    },"Thread2").start();
    
  • 偏向锁撤销之调用wait/notify
    偏向锁状态执行obj.notify() 会升级为轻量级锁
    偏向锁状态执行obj.wait(timeout) 会升级为重量级锁


轻量级锁

轻量级锁: 两个线程轻微竞争
偏向锁升级轻量级锁
轻量级锁膨胀为重量级锁,过程为:轻量级锁 --》无锁态 --》 重量级锁

锁对象转换总结

在这里插入图片描述
简单理解:锁升级时都会先变为无锁状态,然后升级为其他锁状态

无锁态 --》偏向锁 -》轻量级锁 -》无锁态 -》 重量级锁

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackHuan_code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值