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
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【力扣专题栏】面试题 01.02. 判定是否互为字符重排,如何利用数组模拟哈希表解决两字符串互排问题?

题解目录 1、题目描述解释2、算法原理解析3、代码编写(1)、两个数组分别模拟哈希表解决(2)、利用一个数组模拟哈希表解决问题 1、题目描述解释 2、算法原理解析 3、代码编写 (1)、两个数组分别模拟哈希表解决 class Solution { public:bool CheckPermutation(string s1, stri…

指针和内存地址的关系(uint8_t和uint32_t的指针有什么区别)

指针在我们的学习中非常常见,有些人只是了解指针的基本概念,却不知道他的原理,到时候使用起来一头雾水,接下来我将对指针做出一些解释说明。 一、数据是如何存储的: 我们初始化一个int变量a,变量a会存储到内存中&#…

flutter 专题四 Flutter渲染流程

一、 Widget - Element - RenderObject关系 二、 Widget 、Element 、RenderObject 分别表示什么 2.1 Widget Widget描述和配置子树的样子 Widget就是一个个描述文件,这些描述文件在我们进行状态改变时会不断的build。但是对于渲染对象来说,只会使用最…

高效内容营销策略提升品牌影响力与客户忠诚度

内容概要 内容营销是一种通过创造和分享有价值的内容,以吸引特定目标受众并促进品牌发展的策略。这种营销形式不仅仅注重产品的直接推广,更着眼于与受众之间建立长期的信任关系。有效的内容营销能够提升品牌在市场中的影响力和客户的忠诚度,…

git 入门作业

任务1: 破冰活动:自我介绍任务2: 实践项目:构建个人项目 git使用流程: 1.将本项目直接fork到自己的账号下,这样就可以直接在自己的账号下进行修改和提交。 这里插一条我遇到的问题,在fork的时候没有将那个only camp4的…

NumPy Ndarray学习

1.NumPy Ndarray 对象简介 NumPy 最重要的特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。ndarray 中的每个元素在内存中都有相同存储大小的区域。 2.N…

网络层3——IP数据报转发的过程

目录 一、基于终点的转发 1、理解 2、IP数据报转发过程 二、最长前缀匹配 1、理解 2、主机路由 3、默认路由 三、二叉线索查找 一、基于终点的转发 1、理解 理解什么叫终点转发 IP数据报的传递,交给路由器后 可不可以做到直接发送给目的主机呢?…

【UGUI】为射击游戏添加动态显示的分数和血量到UI界面

项目背景 在这个项目中,我们希望实现一个简单的游戏系统,其中玩家可以通过击中目标来获得分数,同时通过与怪物碰撞来减少血量。分数和血量需要在游戏界面上实时显示,以便玩家能够随时了解自己的状态。 技术实现 1. 静态变量的使…

「C/C++」C/C++标准库 之 #include<cstdlib> 通用工具函数库

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

CTF压缩包破解神器bkcrack教程和详细使用过程

kali安装bkcrack教程和详细使用过程 1.bkcrack介绍:2.bkcrack功能:3.bkcrack安装:Linux-Kali下:测试:Windows下安装: 4.bkcrack的使用方法:4.1查看相关参数4.2恢复内部密钥从 zip 档案中加载数据…

基于Python的乡村居民信息管理系统【附源码】

基于Python的乡村居民信息管理系统 效果如下: 系统主页面 系统登录页面 管理员主页面 居民管理页面 政务学习页面 土地信息管理页面 个人信息管理页面 居民登陆页面 村委人员主页面 研究背景 随着信息技术的飞速发展和乡村振兴战略的深入实施,传统的乡…

UI设计公司—兰亭妙微—提供轨道交通行业UI设计

蓝蓝设计工作室2008年开始,2011年正式成立北京兰亭妙微科技有限公司,主创清华团队,专注软件和互联网ui设计开发,擅长企业信息化管理、监控、大数据软件UIUE咨询和设计开发服务。立足UI,一直在学习进步。交通行业UE UI解…

2-Ubuntu/Windows系统启动盘制作

学习目标: 掌握使用Win32DiskImager、Rufus等工具制作系统启动盘的基本步骤。独立将ISO镜像文件写入USB闪存驱动器,确保在需要时顺利安装或修复系统。通过学习如何选择正确的源文件和目标驱动器,理解启动盘的使用场景和注意事项,…

Java项目管理与SSM框架介绍

Maven简介 Maven是一个项目管理工具。它可以帮助程序员构建工程,管理jar包,编译代码,完成测试,项目打包等等。Maven工具是基于POM(Project Object Model,项目对象模型)实现的。在Maven的管理下每…

CGAL生成简单形状

三角形 四边形 立方体 六面体 棱柱 锥体 二十面体 网格 Polyhedron _mesh;/**************三角形************/CGAL::make_triangle(K::Point_3(100, 0, 0), K::Point_3(0, 100, 0), K::Point_3(0, 0, 0), _mesh);CGAL::IO::write_polygon_mesh("F:/WORK/STL/triangle.stl…

江协科技STM32学习- P30 FlyMCU串口下载STLink Utility

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

【Python】【数据可视化】【商务智能方法与应用】课程 作业一 飞桨AI Studio

作业说明 程序运行和题目图形相同可得90分,图形显示有所变化,美观清晰可适当加分。 import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 1, 100) y1 x**2 y2 x**4plt.figure(figsize(8, 6))# yx^2 plt.plot(x, y1, -., labelyx^2,…

提高后端接口性能的方法

个人bibilailai(不喜请跳过):前几天参加的部门技术分享会,同事分享了一个内容为“提高接口性能的常见技巧”,个人觉得很有用,所以想在这里分享给大家,希望对刚入职场不久的兄弟姐妹们有所帮助。…

.net Core 使用Panda.DynamicWebApi动态构造路由

我们以前是通过创建controller来创建API,通过controller来显示的生成路由,这里我们讲解下如何不通过controller,构造API路由 安装 Panda.DynamicWebApi 1.2.2 1.2.2 Swashbuckle.AspNetCore 6.2.3 6.2.3添加ServiceAction…

服务器新建用户

文章目录 前言一、步骤二、问题三、赋予管理员权限总结 前言 环境: 一、步骤 创建用户需要管理员权限sudo sudo useradd tang为用户设置密码 sudo passwd tang设置密码后,可以尝试使用 su 切换到 tang 用户,确保该用户可以正常使用&#…