山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(十九)- JUC(5)

synchronized优化原理

轻量级锁

如果一个对象有多个线程访问,但多线程访问的时间是错开的(没有竞争),可以用轻量级锁优化

  @Slf4j(topic = "c.ExerciseTransfer")public class Test {​static final Object obj = new Object();public static void main(String[] args) throws InterruptedException {synchronized (obj){method();}}​public static void method(){synchronized (obj){}}}

让锁记录中 Object reference 指向锁对象,并尝试用 cas 替换 Object 的 Mark Word,将 Mark Word 的值存 入锁记录

如果 cas 替换成功,对象头中存储了 锁记录地址和状态 00 ,表示由该线程给对象加锁,这时图示如下。

如果 cas 失败,有两种情况

  • 如果是其它线程已经持有了该 Object 的轻量级锁,这时表明有竞争,进入锁膨胀过程

  • 如果是自己执行了 synchronized 锁重入,那么再添加一条 Lock Record 作为重入的计数

当退出 synchronized 代码块(解锁时)如果有取值为 null 的锁记录,表示有重入,这时重置锁记录,表示重入计数减一。

当退出 synchronized 代码块(解锁时)锁记录的值不为 null,这时使用 cas 将 Mark Word 的值恢复给对象头

  • 成功,则解锁成功

  • 失败,说明轻量级锁进行了锁膨胀或已经升级为重量级锁,进入重量级锁解锁流程

锁膨胀

如果在尝试加轻量级锁的过程中,CAS 操作无法成功,这时一种情况就是有其它线程为此对象加上了轻量级锁(有 竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁。

这时 Thread-1 加轻量级锁失败,进入锁膨胀流程

  • 即为 Object 对象申请 Monitor 锁,让 Object 指向重量级锁地址

  • 然后自己进入 Monitor 的 EntryList BLOCKED

当 Thread-0 退出同步块解锁时,使用 cas 将 Mark Word 的值恢复给对象头,失败。这时会进入重量级解锁 流程,即按照 Monitor 地址找到 Monitor 对象,设置 Owner 为 null,唤醒 EntryList 中 BLOCKED 线程。

自旋优化

重量级锁竞争的时候,还可以使用自旋来进行优化,如果当前线程自旋成功(即这时候持锁线程已经退出了同步块,释放了锁),这时当前线程就可以避免阻塞。

偏向锁

轻量级锁在没有竞争时(就自己这个线程),每次重入仍然需要执行 CAS 操作。

Java 6 中引入了偏向锁来做进一步优化:只有第一次使用 CAS 将线程 ID 设置到对象的 Mark Word 头,之后发现这个线程 ID 是自己的就表示没有竞争,不用重新 CAS。以后只要不发生竞争,这个对象就归该线程所有。例如:

  static final Object obj = new Object();public static void m1() {synchronized( obj ) {// 同步块 Am2();}}public static void m2() {synchronized( obj ) {// 同步块 Bm3();}}public static void m3() {synchronized( obj ) {// 同步块 C}}

偏向状态

之所以要用偏向锁是因为轻量级锁的锁重入每次都调用CAS进行对比,CAS是一个OS指令操作,速度很慢。所以偏向锁是把ThreadId直接赋值给markword,那么下次能直接在java上对比这个markword。

  1. 偏向锁带有延迟性,通常对象创建过一会才会生成

  2. 先生成偏向锁->轻量级锁->重量级锁

  3. 如果给临时区使用偏向锁,那么对应执行线程的id赋值给markword

  4. 如果使用了锁的hashcode,那么偏向锁就会被禁止,因为hashcode占用的bit太多。

  5. 轻量级在锁记录上记录hashcode,重量级在monitor上记录

  6. 如果两个线程用同一个偏向级锁,那么锁会变成不可偏向,升级为轻量级锁。

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

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

相关文章

关于阳光雨露外派联想的面试感想

最近在找工作,接到了一个阳光雨露外派联想的面试邀请。说实在的一开始就有不对劲的感觉。想必这就是大厂的自信吧,上就问能不能现场面试,然后直接发面试邀请。这时候我倒是没觉得有啥问题。 然后今天就去面试去了,住的比较偏&…

【研发日记】【策划向】(一)游戏策划其实就是一道加减法题

文章目录 序设计的过程其实是控制自己欲望的过程我海纳百川,你要不要看看?我跟别人不一样!我的人设就是没有人设,或者说任何人设都是我的人设 记 序 不知不觉进入这个行业几年了,也经历了独立开发和团队开发的过程。在…

欣赏倪诗韵青桐断纹古琴很罕见:万中无一。

欣赏倪诗韵青桐断纹古琴很罕见:万中无一。龙池侧签海门倪诗韵制,带收藏证书此琴断纹优美如江面波光粼粼,为流水蛇腹断,是倪老师作品精品中的精品。细心的朋友可以看出倪老师在这张琴上题字非常小心认真。用一个词来形容——万中无…

CPython3.7.9源码学习一:C语言基础、整数对象

C 语言基础 结构体 // struct(关键字) 名称 {结构体成员};// 定义结构体 struct Student { char name[50]; int age; float score; };// 初始化 结构体变量 struct Student stu1; strcpy(stu1.name, "张三"); stu1.age 20; stu1.score 90.5;// 初始化 …

Spring Boot线程池的 使用

一.异步方法 1.启动类加EnableAsync注解 2.在需要异步执行的方法上添加Async注解 3.直接调用 结论:异步方法是通过SpringBoot中自动注入的线程池任务执行器实现的 二.自定义线程池 1.创建线程的配置类 2.使用Async注解时指定名称 3.结论 手动注入多个线程池任务执…

Java 18新特性

Java 18引入了一系列新的特性和改进,这些更新覆盖了从基本语言构造到更高级别的API等多个方面。以下是一些Java 18的主要新特性: 模式匹配增强:Java 18改进了模式匹配功能,使其更加强大和易于使用。开发人员可以使用模式匹配来简…

Linux echo命令(在终端输出文本)

文章目录 Linux Echo命令深度解析简介命令语法常见选项- -n:不输出行尾的换行符,这意味着输出后不会换到下一行。- -e:启用反斜杠转义的解释,允许使用特殊字符。- -E:禁用反斜杠转义的解释(默认选项&#x…

基于地理坐标的高阶几何编辑工具算法(2)——相交面裁剪

文章目录 工具步骤应用场景算法输入算法输出算法示意图算法原理后处理 工具步骤 选中一个需要裁剪的面,点击“相交面裁剪”工具,多选裁剪模板面,空格执行。 应用场景 常用于基于遥感影像的建筑物几何面编辑。 算法输入 一个待裁剪的面&a…

sqlserver的查询(三)

目录 10. group by(分组) 11. having(对分组后的信息过滤) 可能从这里开始,执行顺序越来越显得重要了!!! 10. group by(分组) 这个查询相比前面会有一些困难; 格式:group by 字段的集合; 功…

Java进阶学习笔记8——单继承、Object类、方法重写

Java 是单继承的,Java中的类不支持多继承,但是支持多层继承。 Object类是所有类的父类。 Java不支持多类继承: Java支持多层继承: 反证法: Object类: Object类是java所有类的祖宗类,我们写的任…

AI爆文写作:我一般不告诉别人的爆文玩法:如何100%抄袭10W+的爆文标题,让你也篇篇爆款

有现成的10w摆在眼前我们要做的就是,100%抄标题,以及内容重述。 具体操作步骤: 找到适合自己账号选题的10w(微信看一看或者头条)100%抄爆文的标题将这篇文章喂给Al,让AI分析文章的写法和主题根据提炼出来的写法和主题&#xff0…

使用鱼香肉丝一键安装重新安装ROS后mavros节点报错,.so文件不匹配

解决方案: 1、写在mavros相关软件,共卸载7个包 sudo apt-get remove ros-melodic-mav*2、重新安装mavros,共安装10个包 sudo apt-get remove ros-melodic-mav*

每日AIGC最新进展(10):符号音乐生成SYMPLEX、新型图像编辑数据集ReasonPix2Pix、角色一致性插画生成、高级的风格个性化扩散模型

Diffusion Models专栏文章汇总:入门与实战 SYMPLEX: Controllable Symbolic Music Generation using Simplex Diffusion with Vocabulary Priors http://arxiv.org/abs/2405.12666v1 本文介绍了一种新的符号音乐生成方法,名为SYMPLEX,它基于…

pod 库发布脚本

repo_tag.sh 文件 #!/bin/zsh# 私有库名称 #PODNAME${PWD##*/} PODNAME"LBHorizontalCenterLayout"function obtain_git_tag {# 类似 "s.version 0.0.1"VERSION_STRINGgrep -E s.version.* ${PODNAME}.podspecTAGtr -cd "[0-9.]" <<&…

使用 JavaParser 解析代码

[自用] 如何判断出 java 代码文本中一个方法的输入参数个数以及类型。用结构体数组存储遍历信息&#xff0c;最后用一个方法实现打印。可以使用第三方库。 如果是一个语句如何判断这个语句中的局部变量个数和类型。那么该怎么实现呢&#xff1f; 要判断 Java 代码文本中一个方…

【电源专题】什么是层间短路(Rare Short),如何检测?

层间短路发生的原因 一般线圈类制品是以漆包线缠绕导磁材料制造而成,漆包线是指外层披覆一层薄薄绝缘漆的铜线。我们常见的线圈类制品有: 电源变压器、 高压变压器、 Switching Power 变压器、 通讯变压器、 脉冲变压器、 环型变压器、 电力传输变压器、 音频传输变压器、 电…

k8s pvc pending waiting for first consumer to be created before binding

动态创建PV失败且提示waiting for first consumer to be created before binding 问题现象 使用WaitForFirstConsumer的StorageClass创建PV失败&#xff0c;PVC Event提示persistentvolume-controller waiting for first consumer to be created before binding。 问题原因 PV…

c# mysql 加锁解锁

c# mysql 加锁解锁 在C#中操作MySQL实现加锁和解锁&#xff0c;通常是通过执行特定的SQL语句来完成。MySQL支持表级锁定和行级锁定。以下是使用MySQL命令执行加锁和解锁的示例代码&#xff1a; using MySql.Data.MySqlClient;// 连接字符串 string connStr "serverloca…

【QGIS入门实战精品教程】5.3:CGCS2000转Lambert投影

参考阅读: 【GlobalMapper精品教程】081:WGS84/CGCS2000转Lambert投影 文章目录 一、加载实验数据二、投影转换三、批量投影转换一、加载实验数据 加载配套实验数据,如下图所示:图层为长沙市范围、长沙市酒店宾馆分布点位、湖南省酒店分布点位矢量数据。 双击图层,打开信…

网段与广播域

ip地址与子网掩码做与运算得到网络号&#xff0c;得到的网络号相同就是同一个网段&#xff0c;否则不是&#xff0c;跟他们在什么位置没有任何关系 这里面pc3和前两个pc虽然不在同一个网段&#xff0c;但是pc1发广播包的时候&#xff0c;pc3也能收到&#xff0c;因为路由器的所…