一马平川
不积跬步无以至千里,后继才能薄发

JVM锁类型笔记

2021年07月03日
0
未分类

之前在看JVM的锁优化中看到JVM中对synchronized实现中,在不同的情况下会对锁进行优化,其中有几种不同的锁实现,此篇做一个笔记,在这个月的月度分享中会将这篇分享到部门同事,共同进步~

JVM锁类型

对象头模型:

轻量级锁

轻量级锁的“轻”是对比重量级锁来的,因为重量级锁需要对互斥量进行更新,操作更加消耗性能,而轻量级锁则是在此基础上继续优化,轻量级锁锁定不会去更新互斥量,而是会在调用这个对象的栈帧中,划出一个区域存放markword的部分信息,然后吧对象头的markword信息复制到这块空间中,然后对markword进行cas更新操作,如果成功则轻量级锁锁定成功。

基本前提就是线程间不会经常需要进行同步。

重量级锁

重量级锁需要MonitorObject,如轻量级锁膨胀的逻辑:

  1. 先会去线程私有的monitor集合中获取,如果没有就去JVM全局的gFreeList中获取一个MonitorObject
  2. 初始化monitor对象
  3. 设置monitor的 header 字段为displaced mark word,owner 字段为Lock Record,obj 字段为锁对象
  4. 设置锁对象头的mark word为重量级锁状态,指向第一步分配的monitor对象

偏向锁

偏向锁在轻量级锁的基础上,更加的“轻量”,因为markword大小的原因,它只在未计算出hashcode之前可以使用(需要JVM参数开启,jdk1.6+默认开启),具体过程是:

  1. 对象在被线程获取到的时候,如果可以偏向,先会将线程ID写入markword中,并将状态设为01,可偏向状态设为1。
  2. 之后如果需要同步,只需要检查markword就可以判断是否还是当前线程偏向,不需要额外的膨胀操作。
  3. 如果有其他线程请求同一个对象的锁,这时候就会进行锁膨胀,为轻量级锁。

如果喜欢这篇文章,可以给作者评个份哦~

原文声明: "转载本站文章请注明作者和出处Nothinglin ,请勿用于任何商业用途"

公众号:苦逼的学生仔