synchronized锁升级详解

synchronized锁升级详解

synchronized是Java中实现线程同步的关键字,它在JVM内部实现了锁的升级机制,从偏向锁到轻量级锁再到重量级锁,这种优化是为了减少锁操作带来的性能开销。

1. 锁的四种状态

Java对象头中的Mark Word会记录锁的状态,主要有以下几种:

  1. 无锁状态:对象未被任何线程锁定
  2. 偏向锁状态:偏向于第一个访问锁的线程
  3. 轻量级锁状态:多个线程交替执行同步块
  4. 重量级锁状态:多个线程竞争同一把锁

2. 锁升级流程

2.1 偏向锁阶段

适用场景:只有一个线程访问同步块

工作原理

  • 当第一个线程访问同步块时,会在对象头和栈帧中的锁记录里存储偏向的线程ID
  • 后续该线程进入和退出同步块时不需要进行CAS操作来加锁和解锁
  • 只需要检查对象头的Mark Word是否存储了当前线程的偏向锁

优点:加锁和解锁不需要额外消耗,和非同步方法性能相差无几

升级时机:当另一个线程尝试获取锁时,偏向锁就会升级为轻量级锁

2.2 轻量级锁阶段

适用场景:多个线程交替执行同步块,没有真正竞争

加锁过程

  1. JVM在当前线程的栈帧中创建锁记录(Lock Record)空间
  2. 将对象头中的Mark Word复制到锁记录中(Displaced Mark Word)
  3. 尝试用CAS将对象头中的Mark Word替换为指向锁记录的指针
  4. 如果成功,当前线程获得锁;如果失败,表示其他线程竞争锁,当前线程尝试使用自旋来获取锁

解锁过程

  1. 使用CAS操作将Displaced Mark Word替换回对象头
  2. 如果成功,表示没有竞争发生;如果失败,表示存在竞争,锁会膨胀为重量级锁

优点:竞争的线程不会阻塞,提高了程序响应速度

升级时机:当自旋超过一定次数(默认10次,可用-XX:PreBlockSpin调整)或者有第三个线程尝试获取锁时,会升级为重量级锁

2.3 重量级锁阶段

适用场景:多个线程同时竞争同一把锁

工作原理

  • 依赖于操作系统底层的互斥量(mutex)实现
  • 未获取到锁的线程会被阻塞,进入等待队列
  • 需要从用户态切换到内核态,开销较大

特点

  • 线程阻塞和唤醒需要操作系统介入,消耗较大
  • 适用于高并发场景,避免CPU空转

3. 锁升级图示

无锁状态 → 偏向锁 → 轻量级锁 → 重量级锁

4. 锁降级

HotSpot JVM中锁只能升级不能降级,但有一种特殊情况:在GC发生时,会暂停所有Java线程(STW),此时会撤销所有偏向锁。

5. 相关JVM参数

  • -XX:+UseBiasedLocking:启用偏向锁(JDK15后默认禁用)
  • -XX:BiasedLockingStartupDelay=0:设置偏向锁启动延迟(默认4秒)
  • -XX:+PrintFlagsFinal:查看JVM所有参数
  • -XX:+PrintSynchronizationStatistics:打印同步统计信息

6. 实际应用建议

  1. 对于低竞争场景,锁升级机制能显著提升性能
  2. 高竞争场景下,可以考虑使用java.util.concurrent包中的显式锁
  3. JDK15后默认禁用偏向锁,因为现代应用往往更适合轻量级锁或重量级锁

锁升级机制是JVM对synchronized性能优化的重要手段,理解这一机制有助于编写更高效的多线程程序。

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

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

相关文章

C++函数如何返回多个参数

在编程中,我们经常会遇到需要函数返回多个值的场景。虽然 C 函数不能直接返回多个参数,但通过一些间接的方法,我们可以轻松实现这一需求。本文将详细介绍几种常见的实现方式,并分析它们的优缺点和适用场景。 1. 引言 在 C 中&…

最新版PhpStorm超详细图文安装教程,带补丁包(2025最新版保姆级教程)

目录 前言 一、PhpStorm最新版下载 二、PhpStorm安装 三、PhpStorm补丁 四、运行PhpStorm 前言 PhpStorm 是 JetBrains 公司推出的 专业 PHP 集成开发环境(IDE),专为提升 PHP 开发效率设计。其核心功能包括智能代码补全、实时语法错误检…

【杂谈】Godot4.4导出到Android平台(正式导出)

学博而后可约,事历而后知要。 目录 一、准备二、Gradle构建三、配置Java SDK四、配置Android SDK五、配置密钥 一、准备 本文在前文【杂谈】Godot4.4导出到安卓平台(调试导出)的基础上,进行正式导出。调试导出并不是真正的编译导…

隔行换色总结

功能效果展示: 第一种思路: 使用数组,将数组的内容渲染到页面上,序号也就是将数组的下标输出到第一个td上,将数组的内容输出到第二个td上,(使用拼接字符串) 具体操作: …

使用文本翻译API打破语言障碍

一、引言 在当今全球化的商业环境中,企业面临着前所未有的语言挑战。无论是出口商品、引进技术,还是与国际客户进行交流,语言障碍始终是一个亟待解决的问题。文本翻译API作为一款高效、稳定的工具,支持多种语言的翻译&#xff0c…

【unity游戏开发入门到精通——动画篇】Animator2D序列帧动画

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、…

深入解析 Jenkins Agent 的 .jnlp 启动文件

🧩 深入解析 Jenkins Agent 的 .jnlp 启动文件 在 Jenkins 中,通过 JNLP(Java Network Launch Protocol)方式连接 Agent 是一种常见且灵活的方式。你可能曾见过类似这样的命令: java -jar agent.jar -jnlpUrl file:/…

定积分__

practice makes perfect 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 若被积函数在积分区间上是可积的,那么变限积分函数在这个区…

Three.js 系列专题 7:性能优化与最佳实践

内容概述 随着 3D 场景复杂度的增加,性能优化变得至关重要。Three.js 项目可能因几何体数量、纹理大小或渲染设置而变慢。本专题将介绍减少 draw call、优化纹理和使用调试工具的最佳实践。 学习目标 学会减少 draw call 和几何体复杂度。掌握纹理压缩与内存管理。使用 Stat…

CentOS 7安装Python3.12

文章目录 使用pyenv安装python3.12一、gitub下载pyenv二、升级GCC三.升级openssl这样python3.12.9就完成安装在CentOS上啦! 使用pyenv安装python3.12 一、gitub下载pyenv https://github.com/pyenv/pyenv 按照README,pyenv教程安装即可 二、升级GCC 安…

【C++】优先级队列+反向迭代器

priority_queue的介绍 通常用堆来实现,能在O(log n)的时间复杂度内插入和提取最高(或最低)优先级的元素。 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的(默认情况)。此…

mysql镜像创建docker容器,及其可能遇到的问题

前提,已经弄好基本的docker服务了。 一、基本流程 1、目录准备 我自己的资料喜欢放在 /data 目录下,所以老规矩: 先进入 /data 目录: cd /data 创建 mysql 目录: mkdir mysql 2、镜像查找 docker search hub.ra…

快速记忆法,提高知识点背诵效率

战国七雄:齐秦 韩赵魏 燕楚 谐音记忆:齐秦 喊赵薇 演出 五等爵位:公侯 伯子 男 记忆方法:公猴 脖子 蓝 安卓应用:记忆宫殿APP 记忆 脑力训练,中小学各学科知识点速记,单词趣味记忆&#xff0c…

从零开始学java--泛型(1)

泛型 学生成绩可能是数字类型,也可能是字符串类型,如何存放可能出现的两种类型呢: public class Score {String name;String id;Object value; //因为Object是所有类型的父类,因此既可以存放Integer也能存放Stringpublic Score…

pdf转latex

Doc2X(https://doc2x.noedgeai.com/) Doc2X 是一个由 NoEdgeAI 提供的在线工具,主要用于将 PDF 文件(尤其是学术论文、报告等文档)转换为 LaTeX 格式。LaTeX 是一种高质量排版系统,广泛应用于学术界和出版…

Visual Studio 2022 UI机器学习训练模块

VS你还是太超标了,现在机器学习都不用写代码了吗!! 右键项目解决方案,选择机器学习模型

无公网实体服务器加装多个操作系统供多个用户互不打扰使用_part1

背景介绍 因笔者业务需求,入手了一个实体服务器,但为了避免出现在一个操作系统中搭建编程环境后有许多相关的进程和服务,拖慢日常的使用,也能让其他人短期使用,更好的利用服务器的性能,让服务器专注于“什…

运动规划实战案例 | 基于四叉树分解的路径规划(附ROS C++/Python仿真)

目录 1 为什么需要四叉树?2 基于四叉树的路径规划2.1 分层抽象2.2 路图搜索2.3 动态剪枝 3 算法仿真3.1 ROS C算法仿真3.2 Python算法仿真 1 为什么需要四叉树? 路径规划的本质是在给定环境中寻找从起点到终点的最优或可行路径,其核心挑战在…

docker快捷打包脚本(ai版)

直接进入主题: 用这个脚本前提是你本地可以拉镜像仓库的镜像,并且在 本地有了,然后将所有的镜像tag写在一个文件中,和下面docker_tags.txt 对应,文件叫什么,脚本里对应改什么,给小白说的 #!/bi…

WinMerge下载及使用教程(附安装包)

文章目录 一、WinMerge安装步骤1.WinMerge下载:2.解压:3.启动: 二、WinMerge使用步骤1.添加文件或文件夹2.查看差异3.格式选择 WinMerge v2.16.36 是一款免费开源的文件与文件夹比较、合并工具,能帮您快速找出差异,提高…