锁消除、锁粗化、偏向锁、适应性锁

article/2025/10/4 8:38:33

文章目录

    • 锁消除
    • 锁粗化
    • 偏向锁
    • 适应性锁

锁消除

锁消除是JIT编译器对内部锁实现的一种优化。JIT可以借助逃逸分析来判断同步块的锁对象是否只是被一个线程访问,如果是的话,则在编译期间不生成内部锁的申请与释放对应的机器码,即消除了锁的使用。这种技术被称为锁消除。它可以减少锁的开销。
在这里插入图片描述
上面的代码在编译时,经过锁消除后,可以等效为下面的:
在这里插入图片描述

StringBuffer是线程安全的类,其append方法和toString方法都是用内部锁进行修饰的,但是当作为方法的局部变量时,因为只会有当前线程对该变量进行访问,所以JIT会进行锁的消除。
如下面代码,当JIT编译doSomething方法时,会将stringBuffer.append和 stringBuffer.toString方法复制到doSomething方法的方法体中,这种技术被成为内联。下面的代码,会对StringBuffer的append和toString方法进行锁的消除。

  private static void doSomething() {StringBuffer stringBuffer = new StringBuffer();stringBuffer.append("1");String s = stringBuffer.toString();}

注意:
并不是所有的方法都会进行锁消除,锁的消除技术依赖于JIT的内联优化,至于哪些方法会被内联,要取决于该方法的热度和该方法字节码的尺寸。

锁消除的好处是我们在需要使用锁的场景时,不用考虑锁的开销,只需要关注我们的业务逻辑即可,JIT会对我们的代码进行锁的消除。
但并不是所有方法都会进行锁消除,这个还是要取决于JIT。锁消除是默认开启的。

锁粗化

锁粗化也是JIT编译器对内部锁的一种优化。
在这里插入图片描述

如上面的代码,这些同步块使用的是同一把锁,则JIT会将这些同步块合并为一个大的同步块,从而减少了锁申请、释放的开销。上面的代码会被JIT粗化成如下代码:
在这里插入图片描述
相邻同步块之间如果存在其他语句,也不一定会阻碍JIT编译器进行锁的粗化,因为JIT编译器可能会在执行锁粗化前进行指定重排序,将这些语句排序到同一临界区内。
锁粗化可能会使一个线程持有一个内部锁的时间变长,从而导致其他线程申请该锁的时间也变长,阻塞了其他线程。因此,锁粗化不会被应用到循环体内的相邻同步块中。锁粗化是默认开启的。

偏向锁

偏向锁是java虚拟机对锁实现的一种优化。当大多数锁没有被争用时,并且在整个生命周期至多只会被一个线程持有,java虚拟机也会对其进行申请锁和释放锁,这就带来了昂贵的开销。因此,jvm会为每个对象维护一个偏好,即一个对象对应的内部锁第一次被一个线程获得时,则该线程就会被记录为该对象的偏好线程,这个线程在后续对该锁的访问都无需申请和释放锁,从而减少了开销。

然而,当该对象被偏好线程以外的线程申请锁时,jvm会回收该对象对原线程的偏好,并重新设置该对象的偏好线程,这个过程的代价也比较昂贵,因此,偏向锁的优化只适用于当前对象没有被大量线程争用的场景。
偏向锁的优化是默认开启的。

适应性锁

适应性锁是JIT编译器对内部锁实现所做的一种优化。
当一个线程获取某个对象的锁时,该锁如果被其他线程占用,则该线程会进行暂停,变为非Runnable状态,由于暂停会导致上下文切换,因此暂停这种方法适用于大多数线程对该锁持有时间比较长的场景,这样才能抵消上下文切换的开销。另外一种方式就是采用忙等,忙等就是当锁被占有时,当前线程不被阻塞,而是执行空的循环,直到获取到锁。
忙等的好处是不会导致上下文切换,但如果等待的时间太长,则会一直执行下去,从而消耗cpu资源。因此忙等适用于绝大多数线程对该锁的持有时间较短的场景。

jvm可以根据不同的场景来选择上面的两种策略。对于线程持有时间较长的锁,jvm会采用暂停的策略,对于线程持有时间较短的锁,jvm会采用忙等的策略。jvm也可能先采用忙等的策略,忙等失败的情况下再采用暂停的策略。jvm的这种优化被成为适应性锁


http://chatgpt.dhexx.cn/article/DdyivDfk.shtml

相关文章

多线程并发之CountDownLatch(闭锁)使用详解

专题相关文章: 从内存可见性看Volatile、原子变量和CAS算法 多线程并发之CountDownLatch(闭锁)使用详解 多线程并发之显示锁Lock与其通信方式Condition源码解读 多线程并发之读写锁(ReentranReadWriteLock&ReadWriteLock)使用详解 多线程并发之线程池Executor与…

【ABAQUS】什么是剪切闭锁?剪切闭锁会导致什么?

“完全积分”是指当单元具有规则形状时,对单元刚度矩阵中的多项式项进行精确积分所需的高斯点数。对于六面体和四边形元素,“规则形状”意味着边缘是直的,并以直角相交,任何边缘节点都位于边缘的中点。 完全积分的线性元素在每个…

电力“五防”闭锁系统

(转载) 电力“五防”闭锁系统 随着电子技术在各个行业领域的飞速发展,电力的“五防”也将发生革命性的转变。现代电力系统规模不断扩大,从而促使电压的等级也得到了进一步提高。为了使电力系统的安全稳定运行能够得以充分保障&am…

【LB-1A 100V电压回路断相闭锁继电器】

系列型号 LB-1A电压回路断相闭锁继电器 LB-1A闭锁继电器 1 用途 LB-1A型电压回路断相闭锁继电器(以下简称继电器)是在交流电压回路断线而可能引起继电保护误动作时,对继电保护进行闭锁。该继电器用于中性点非直接接地系统中。 2 结构与工作原…

间隙锁

一.几个基本概念 行锁:给某一行加的锁间隙锁:就是两个值之间的间隙。为了解决幻读问题,InnoDB 只好引入新的锁,也就是 间隙锁 (Gap Lock)。间隙锁Gap,左右都是开区间,间隙锁行锁合称next-key lock,每个 next-key lock…

闭锁,信号量,栅栏

1. 闭锁(countDownLatch) 1.1. 作用: 相当于一扇门,在闭锁到达结束状态之前,这扇门是关着的,所以的线程都不允许通过,当闭锁到达结束状态,这扇门打开并允许所有的线程通过。在…

visio 2010激活教程

一、下载office2010toolkit.zip 若下载链接失效,手动搜索office2010toolkit http://ys-c.ys168.com/605279628/o4W138W45JIPI5SiuWf5/office2010toolkit.zip二、激活 激活过程中需要关闭office套件

Microsoft Visio Professional 2013 安装步骤

1.打开解压后的文件夹,点击setup.exe安装 2.勾选我接受此协议的条款,继续 3.点击立即安装 4.安装完成,关闭。 5.打开第一步解压的文件夹中破解文件夹,鼠标右键以管理员身份运行 6.点击激活office2013VL 7.激活完成 Microsoft Visi…

激活Visio2013

最近需要用Visio,由于密钥过期了,也不知道怎么重新输密钥,于是网上搜索,终于找到了一个方法。 KMSpico工具,安装完后直接打开点击左边红色按钮就可以了。如图: 最后附上工具链接https://pan.baidu.com/s/1…

机器学习十大算法之-CART分类决策树、回归树和模型树

转载(http://blog.163.com/zhoulili1987619126/blog/static/35308201201542731455261/) Classification And Regression Tree(CART)是决策树的一种,并且是非常重要的决策树,属于Top Ten Machine Learning Algorithm。顾名思义&…

决策树入门以及树模型的参数选择

决策树及树模型的参数选择 决策树的基本概念 在数据结构中树是一个重要的数据结构,这里树被我们根据分支起到一个决策的作用。什么是决策?通俗的说就是判断或者决定,我们引用周志华的西瓜书中的例子:这是一个好瓜吗?当…

gbdt、xgb、lgb决策树模型

目录 1.决策树1.1 CART分类树1.2 CART回归树 2.gbdt3.xgboost4.lightgbm5.模型对比6.参考文献 本文主要对决策树、gbdt、xgboost、lightgbm、catboost进行简述和整理,包括模型原理、优劣性等内容 1.决策树 决策树是一种通过对历史数据进行测算,对新数据…

树模型与线性模型的融合模型(Python实现)

目录 一、树模型与线性模型的融合模型 二、Python sklearn实现GBDTLR融合模型 一、树模型与线性模型的融合模型 树模型GBDT原理:https://blog.csdn.net/woniu201411/article/details/83114226 线性模型LR原理:https://blog.csdn.net/woniu201411/art…

机器学习理论与实战(九)回归树和模型树

前一节的回归是一种全局回归模型,它设定了一个模型,不管是线性还是非线性的模型,然后拟合数据得到参数,现实中会有些数据很复杂,肉眼几乎看不出符合那种模型,因此构建全局的模型就有点不合适。这节介绍的树回归就是为了解决这类问题,它通过构建决策节点把数据数据切分成…

决策树模型

本文代码及数据集来自《Python大数据分析与机器学习商业案例实战》 决策树模型的建树依据主要用到的是基尼系数的概念。基尼系数(gini)用于计算一个系统中的失序现象,即系统的混乱程度。基尼系数越高,系统的混乱程度就越高&#x…

新版HyperMesh的Assemblies中调出下拉菜单查看Component(装配关系模型树)

新版HyperMesh的Assemblies中调出下拉菜单查看Component(装配关系模型树) 从Altair更新的2019版本开始,在Model模型树中找不到Assemblies了,这样导致好多用户一直在用14或者17版本,其实这次更新不是把这个功能取消掉了…

Cesium bim模型加载并与模型树关联(分层加载)

很久都没写文章了,最近实在是太忙了,向各位关注我的小伙伴致个歉! 最近没事儿写了个模型树和模型关联的功能,处理工具是用的cesiumlab。 说明一下为什么要用cesiumlab: 网上现在有很多的模型转换工具,如…

举例讲清楚模型树和回归树的区别

根据上面图中的一个例子,我们来分析下,假设A、B两点是曲线上的噪声点。 模型树的叶子节点是一个分段线性函数[1]。 回归树的叶子节点是取一个区间的平均(一个常数值)。 上述图中AB区间的均值是一个暗点。 所以: 对于节点A而言,模…

[Ansys Workbench] Mechanical 界面显示模型树窗口和详细信息窗口

根据这个回答才找到的……我之前也没注意,别人问我我才去想的 https://forum.ansys.com/discussion/8740/workbench-tree-outline 一般的方法是在 主页 - 布局 - 管理 里面选择显示哪个视窗 如果就是想显示模型树窗口和详细信息窗口,可以使用快捷键 Ctr…

creo文件如何检入服务器,CREO模型树配置的保存与检索

保存模型树配置 (1)单击 然后单击“保存设置文件”(Save Settings File)。“保存模型树配置”(Save Model Tree Configuration) 对话框打开。 (2)接受默认文件名 tree.cfg 或键入新名称。 (3)单击“保存”(Save)。 手动检索模型树配置 (1)单击 然后单击“打开设置文件”(Open S…