jvm学习笔记-轻量级锁内存模型

一,轻量级锁

  1. LockRecord的那个第一个成员变量是拷贝对应锁定了的java对象资源的MarkWord,
  2. Lock Record有一个Ptr指针刚开始指向自己,后面这个指针存储在锁定资源的java对象的markword中,后续可以通过java对象的MarkWord快速定位到LockRecord本身。
  3. 一个是记录Object对象的指针PtrObj,方便定位到锁定的java对象资源
  4. 还有一个是记录锁的重入次数cnt

步骤1:锁1次

我首先来介绍MarkWord(32bits)这个红色的图怎么理解?

首先这四行分别对应了"无锁","偏向锁","轻量级锁","重量级锁",其实真正应用起来,只用到其中1行的数据,也就是说,我这个java对象,

无锁的时候,MarkWord里面内容就是"hashcode","age","biased_lock","state",25 + 4 + 1 + 2 = 32bits

偏向锁的时候,MarkWord里面内容就是"Thread-ID","epoch","age","biased_lock","state" 23 + 2 + 4 + 1 + 2 = 32 bits

轻量级锁的时候,MarkWord里面内容就是"ptr_to_lock_record","state",30 + 2 = 32bits

重量级锁的时候,MarkWord里面内容就是"ptr_to_heavyweight_monitor","state",30 + 2 = 32bits

如果state = 11,那么就是标记为gc,即将垃圾回收了应该是.

步骤二:又锁了一次(锁重入)

CopyOfMarkWord = NULL,ObjPtr = this , cnt = cnt + 1

步骤三:

unlock一次锁

cnt = cnt - 1,然后根据栈里面锁的次序,后入先出,依次解锁,解锁的时候发现LockRecord里面的MarkWord为NULL,表示还可以解锁,不是最后一层锁。

后面再解锁

步骤四:

解锁到最后一层,(其实是发现了该LockRecord的MarkWord不为NULL,认为是最后一层锁),因为是最后一层,因此使用CAS把MarkWord拷贝回去object里面,再用CAS吧LockRecord指针拷贝回去原来LockRecord里面,然后ObjPtr置为NULL。

注意,中间的CAS修改如果失败,说明发生竞争,会膨胀为重量级锁!!

二,偏向锁

偏向锁主要是MarkWord里面存储获取锁的线程ID,修改biased_lock标志为1和最后两位为01

相关推荐
阿龟在奔跑2 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list
王佑辉2 小时前
【jvm】方法区常用参数有哪些
jvm
王佑辉2 小时前
【jvm】HotSpot中方法区的演进
jvm
Domain-zhuo3 小时前
什么是JavaScript原型链?
开发语言·前端·javascript·jvm·ecmascript·原型模式
Theodore_10221 天前
7 设计模式原则之合成复用原则
java·开发语言·jvm·设计模式·java-ee·合成复用原则
我是苏苏1 天前
Web开发:ORM框架之使用Freesql的DbFrist封装常见功能
java·前端·jvm
天草二十六_简村人1 天前
Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化
java·jvm·数据库·mongodb·阿里云·微服务·云计算
老码沉思录1 天前
Android开发实战班 - 数据持久化 - Room 数据库应用
android·jvm·数据库
起名字真南1 天前
【C++】深入理解 C++ 中的继承进阶:多继承、菱形继承及其解决方案
java·jvm·c++·chatgpt·aigc
偶尔。5351 天前
JVM垃圾回收算法详解
jvm