开启偏向锁一定性能更好吗?

2023-10-21 23:30

本文主要是介绍开启偏向锁一定性能更好吗?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、背景

最近工作中遇到由于使用偏向锁导致性能下降的案例。
趁机总结下偏向锁的概念和锁的升级过程,以及重点聊下偏向锁是否会让性能更优化。

二、偏向锁

偏向锁是Java 6之后加入的一种针对加锁操作的优化手段,它是基于:在大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得。因此,为了减少同一线程获取锁的代价(会涉及到一些CAS操作,耗时),引入了偏向锁。

偏向锁的工作原理是:当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储锁偏向的线程ID,以后该线程再次进入同步块时,无需再做任何同步操作。这样就省去了大量有关锁申请和释放的操作,从而提高程序的运行效率。
在这里插入图片描述

当有另一个线程试图访问同步块时,偏向模式就宣告结束。根据对象头里记录的信息判断是否需要撤销偏向。如果需要撤销,则等待原来的线程进入安全点(safepoint),然后暂停它,并清除对象头和栈帧中的相关信息。撤销之后重新竞争获取轻量级锁。

三、锁升级

锁的升级过程是这样的:无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁。这个过程是不可逆的,这么做是为了提高同步的性能。

偏向锁阶段
当一个线程第一次访问一个同步块时,会在对象头和栈帧中记录线程ID,这时对象处于偏向锁状态。如果后续没有其他线程竞争该对象,那么该线程再次进入同步块时就无需再做任何同步操作。

升级轻量级锁
如果有另一个线程试图获取该对象的锁,那么偏向锁就会被撤销,并升级为轻量级锁。轻量级锁是通过 CAS 操作在对象头中设置一个指向栈中锁记录的指针来实现的。如果CAS 成功,那么当前线程就获得了轻量级锁;如果CAS失败,说明有多个线程竞争该对象,那么轻量级锁就会升级为重量级锁。

升级重量级锁
重量级锁是通过在对象头中设置一个指向重量级监视器(monitor)的指针来实现的。重量级监视器会阻塞所有未获得该对象的线程,并唤醒其中一个等待线程来获取该对象。这样就避免了多个线程不断自旋消耗CPU资源 。

特殊情况
在这里插入图片描述

hashCode 并不是初始就写在对象头的,而是第一次调用 hashCode 方法时写入的。
如果一个对象没有获取偏向锁前调用 hashCode 方法,则进入普通无锁状态并存储 hashCode。
当已经获取偏向锁后调用 hashCode 或 wait 方法,则直接竞争重量级锁。
详情参见:《HashCode方法的调用对Java锁的影响》

四、偏向锁性能更好?

通过前面的介绍,我们不难知道:

偏向锁性能更好的情况是,当一个对象只有一个线程访问,并且不会有其他线程竞争该对象时。这样,偏向锁可以完全取消同步操作,只需要在第一次获取锁时进行一次CAS操作,之后就可以直接进入同步块。

但是,如果一个对象经常被多个线程竞争,那么偏向锁就会频繁地撤销和恢复,增加了额外的开销。这种情况下,使用轻量级锁或重量级锁可能更合适。

不知道大家有没有留意自己的服务器的 JVM 参数配置,有些高并发的服务,开启偏向锁后会因为偏向锁频繁撤销导致系统停顿时间增加,偏向锁的撤销需要等待全局安全点(safe point),暂停持有偏向锁的线程,检查持有偏向锁的线程状态。

Java在JDK1.6 以后默认已经开启了偏向锁这个优化,JDK15 中,偏向锁被默认禁用了,偏向锁带来的加锁时性能提升从实际效果上看并不明显,不再推荐使用,最终将被废弃。

Biased locking introduced a lot of complex code into the synchronization subsystem and is invasive to other HotSpot components as well. This complexity is a barrier to understanding various parts of the code and an impediment to making significant design changes within the synchronization subsystem. To that end we would like to disable, deprecate, and eventually remove support for biased locking.

如果你想手动开启或关闭偏向锁,你可以使用 -XX:+UseBiasedLocking -XX:-UseBiasedLocking 参数来控制。

Applications with substantial amounts of uncontended synchronization may attain significant speedups while others with certain patterns of locking may see slowdowns.

一句话结论:一般来说面向C 端的,并发较高的应用,尽量关闭偏向锁;面向 B 端的,并发较低的应用,可以考虑开启偏向锁。

五、More

很多人说:“面试造火箭,入职拧螺丝”。
但工作中真正遇到疑难杂症时,还是这些造火箭的知识更能解决问题。
学习不是目的,学习的目的还是为了:”学以致用“。
大家学习某个技术时,要了解某项技术解决什么问题,优缺点是什么。

每个问题都是我们深入掌握某个知识点的绝佳机会。当你工作中遇到问题时,一定要有寻根究底的态度,趁机掌握好相关知识,才能不断增加技术深度。

学任何知识都要比一般人掌握更多才能更具有优势。对于偏向锁而言,不仅要知道概念,还要知道为什么提供这种特性,什么情况下使用,进一步了解锁的升级过程,了解锁升级的特殊情况等。

六、参考文章

[1] 《25 张图 | 深入浅出「偏向锁》」
[2] 《HashCode方法的调用对Java锁的影响》
[2] 《Java 6 性能白皮书》
[3] JEP 374: Deprecate and Disable Biased Locking

这篇关于开启偏向锁一定性能更好吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/257641

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

黑神话,XSKY 星飞全闪单卷性能突破310万

当下,云计算仍然是企业主要的基础架构,随着关键业务的逐步虚拟化和云化,对于块存储的性能要求也日益提高。企业对于低延迟、高稳定性的存储解决方案的需求日益迫切。为了满足这些日益增长的 IO 密集型应用场景,众多云服务提供商正在不断推陈出新,推出具有更低时延和更高 IOPS 性能的云硬盘产品。 8 月 22 日 2024 DTCC 大会上(第十五届中国数据库技术大会),XSKY星辰天合正式公布了基于星

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

PR曲线——一个更敏感的性能评估工具

在不均衡数据集的情况下,精确率-召回率(Precision-Recall, PR)曲线是一种非常有用的工具,因为它提供了比传统的ROC曲线更准确的性能评估。以下是PR曲线在不均衡数据情况下的一些作用: 关注少数类:在不均衡数据集中,少数类的样本数量远少于多数类。PR曲线通过关注少数类(通常是正类)的性能来弥补这一点,因为它直接评估模型在识别正类方面的能力。 精确率与召回率的平衡:精确率(Pr

SQL2005 性能监视器计数器错误解决方法

【系统环境】 windows 2003 +sql2005 【问题状况】 用户在不正当删除SQL2005后会造成SQL2005 性能监视器计数器错误,如下图 【解决办法】 1、在 “开始” --> “运行”中输入 regedit,开启注册表编辑器,定位到 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVer

跟我一起玩《linux内核设计的艺术》第1章(四)——from setup.s to head.s,这回一定让main滚出来!(已解封)

看到书上1.3的大标题,以为马上就要见着main了,其实啊,还早着呢,光看setup.s和head.s的代码量就知道,跟bootsect.s没有可比性,真多……这确实需要包括我在内的大家多一些耐心,相信见着main后,大家的信心和干劲会上一个台阶,加油! 既然上篇已经玩转gdb,接下来的讲解肯定是边调试边分析书上的内容,纯理论讲解其实我并不在行。 setup.s: 目标:争取把setup.

Linux性能分析工具合集

Linux性能分析工具合集 工具合集主要包含以下各种工具,对于了解Linux系统结构、网络结构、内核层次具有一定的帮助。 Linux Performance Observability ToolsLinux Static Performance ToolsLinux Performance Benchmark ToolsLinux Performance Tuning ToolsLinux