多线程锁的升级原理是什么

news/2024/11/13 20:36:24/文章来源:https://www.cnblogs.com/89564f/p/18539943

  

锁的级别:无锁 => 偏向锁 => 轻量级锁 => 重量级锁

 

无锁:没有对资源进行锁定,所有线程都可以访问,但是只有一个线程能成功修改资源,其他的线程会不断尝试,直至修改成功。  

 

偏向锁:偏向锁是指当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储线程ID。一旦该线程再次进入同步块,无需再次获取锁,只需检查对象头的标记位即可。

 

偏向锁的撤销:当有其他线程尝试竞争偏向锁时,偏向锁会被撤销,升级为轻量级锁。撤销过程需要在安全点(Safe Point)进行,确保没有字节码正在执行。  

 

轻量级锁:轻量级锁是指当锁是偏向锁的时候,被第二个线程 B 所访问,此时偏向锁就会升级为轻量级锁,线程 B 会通过自旋的形式尝试获取锁,线程不会阻塞,从而提高性能。当前只有一个等待线程,则该线程将通过自旋进行等待。但是当自旋超过一定的次数时,轻量级锁便会升级为重量级锁;当一个线程已持有锁,另一个线程在自旋,而此时又有第三个线程来访时,轻量级锁也会升级为重量级锁。

 

重量级锁:指当有一个线程获取锁之后,其余所有等待获取该锁的线程都会处于阻塞状态。 重量级锁会导致线程上下文切换,开销较大。

 

锁的降级:JVM 并不支持锁的降级,即一旦锁升级为重量级锁,就不会再降级为轻量级锁或偏向锁。锁的升级是单向的,不可逆的。

 

总结

无锁:适用于读多写少的场景,或者对性能要求极高的场景。

偏向锁:适用于单个线程长时间持有锁的场景。

轻量级锁:适用于锁竞争不激烈的场景,通过自旋减少线程切换的开销。

重量级锁:适用于锁竞争激烈或锁持有时间较长的场景,确保线程的安全性和互斥性。

  

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

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

相关文章

Eplan2022卡顿问题解决

EPLAN2022卡顿崩溃怎么解决第一步:可以检查下用户设置。打开菜单 "选项 → 设置:用户 → 翻译 → 字典": 不勾选"自动完成"和"自动更正"。在选项设置框中输入"自动",快速找到用户设置,取消勾选,如下图。 第二步:可以检查下电脑语…

Linux中文件系统层次结构简述

在Linux操作系统中,并没有像Windows那样的“盘符”概念。相反,Linux使用一个统一的文件系统层次结构,所有的文件和目录都挂载在一个单一的根目录 / 下。这种设计使得文件系统的管理更加灵活和一致。 文件系统层次结构 在Linux中,文件系统通常按照以下层次结构组织:/(根目…

创建线程有哪几种方式

1. 继承 ​​Thread​​ 类 优点:简单直观,适合初学者。 直接继承 ​​Thread​​ 类,可以方便地访问和使用 ​​Thread​​ 类的方法。缺点:Java 不支持多继承,因此如果你的类已经继承了其他类,则不能继承 ​​Thread​​ 类。 仅适用于简单的线程任务。示例:class MyT…

[豪の学习笔记] CI/CD相关 - Docker

Docker常见命令,命名别名,数据卷挂载,本地目录挂载,自定义镜像,容器网络互联一、docker常见命令单独下载镜像文件 docker pull 查看本地镜像文件 docker images 删除本地镜像文件 docker rmi 基于dockerfile构建自定义镜像 docker build 将打包好的镜像保存在本地 docker …

excel中查找亏损第一大第二大第三大的商品的亏损金额;涨出第一大,第二大,第三大的金额;以及查找对应数值的商品的名称,

k2 里的公式 =LARGE(IF(B:B="品类1",E:E),1) lL 里的公式 =LARGE(IF(B:B="品类1",E:E),2) M2里额公式 =LARGE(IF(B:B="品类1",E:E),3) N2里的公式=MIN(IF(B:B="品类1",E:E),1) O2里的公式=SMALL(IF(B:B="品类1",E:E),2) P2里…

线程池都有哪些状态

线程池有五种典型状态: 1.RUNNING(运行状态):在这个状态下,线程池可以接收新的任务提交,并且能够处理已添加到任务队列中的任务。这是线程池的初始状态,也是最活跃的状态。这是最正常的状态 2.SHUTDOWN(关闭状态)当调用了线程池的`shutdown()`方法后,线程池进入此状…

GIT RE-BASIN: MERGING MODELS MODULO PERMUTATION SYMMETRIES (1)

在深度学习模型的训练过程中,经常会遇到这样的现象:每次训练,虽然初始值、随机种子、训练数据的顺序不一样,但是得到的loss曲线都差不多,在验证集上的结果也差不多.这篇论文从land scape的角度解释了这个问题:神经网络的loss landscape并不是我们想象中的很混乱、毫无规律,而…

GIT RE-BASIN: MERGING MODELS MODULO PERMUTATION SYMMETRIES

在深度学习模型的训练过程中,经常会遇到这样的现象:每次训练,虽然初始值、随机种子、训练数据的顺序不一样,但是得到的loss曲线都差不多,在验证集上的结果也差不多.这篇论文从land scape的角度解释了这个问题:神经网络的loss landscape并不是我们想象中的很混乱、毫无规律,而…

hashCode()与equals()之间的关系

在Java中,`hashCode()`和`equals()`方法之间存在紧密的关系,主要体现在它们共同作用于对象的比较和存储上,尤其是在集合(如HashSet、HashMap)和哈希表的实现中。 1.hashCode()和equals()是Object类中定义的两个重要方法,用于对象的比较和哈希处理。 2.hashCode()方法:h…

文生视频大模型

简介Sora 官网地址:https://openai.com/sora文生视频指的是将文本描述转化为视频内容的技术,2024年2月15日 OpenAI 正式对外发布 Sora 人工智能模型,在人工智能领域掀起了一场风波,这是计算机视觉领域的一个突破。 Sora 这一名称起源于日文中“空”的含义,暗示了其具备的无…

泛型中extends和super的区别

泛型中的 ​​extends​​​ 和 ​​super​​ 关键字用于设置类型参数的上下界,控制可以传递给泛型类型的参数类型。它们的区别在于限制的方向和用途: 1.extends:上界限制: 使用 ​​extends​​ 关键字定义了一个类型参数的上界,意味着传入的类型必须是指定类型或其子类型…