Java JVM 2: 锁优化

JVM中的锁优化 锁类型适用场景实现方式性能开销偏向锁单线程重复访问CAS标记线程ID最低轻量级锁短时间竞争CAS + 自旋中等重量级锁长时间竞争或多线程阻塞操作系统互斥量最高。 阅读详情

众所周知,多线程访问临界区资源会造成数据不一致问题,也就是通常说的线程不安全,锁存在的目的就是保证线程安全,但不能粗暴的对一切临界区资源加锁,在线程安全的前提下还要保证高并发,JVM对锁进行了多种优化措施。
本文这里的优化仅讨论jvm层面的优化,关于应用层面和jdk中关于锁的优化措施,参见:
对象头和markword:
java中对象都有一个对象头用于保存对象的系统信息。对象头中有mark word,32/64位机中长度为32/64。mark word中根据锁的不同类型存放有对象的哈希值、对象年龄、锁的指针等信息。
以32位系统为例:

  • 对象处于未锁定状态时:[header |0|01]
    前29位表示哈希值、年龄等信息,倒数第三位0,最后两位01表示未锁定
  • 偏向锁状态时:[JavaThread* |epoch|age|1|01]
    前23位表示持有偏向锁的线程,后续2位表示偏向锁的时间戳(epoch),对象年龄(age)
  • 轻量级锁状态:[ptr |00] locked
    指向获得锁的线程栈中该对象的真实对象头
  • 重量级锁状态:[prt |10 ] monitor
    指向monitor的指针

JVM中锁的演化与优化:

  • 偏向锁
    使用-XX:+UseBiasedLocking参数开启,在竞争激烈的场合下意义不大,大量竞争会导致持有锁的线程不停的切换,锁很难保持在偏向模式。
  • 轻量级锁
    偏向锁失败的话线程会申请轻量级锁,具体实现中有类似cas操作。
  • 重量级锁
    轻量级锁失败后就会膨胀为重量级锁
    • 废弃前面的BasicLock备份的对象头信息
    • 启用重量级锁
      首先inflate()方法进行锁膨胀以获得对象的ObjectMonitor,然后使用enter()方法尝试进入该锁。
      enter()方法调用线程有可能在操作系统层面被挂起,这样线程间切换和调度的成本会比较高。
  • 自旋锁
    锁膨胀后虚拟机会做最后的努力以避免线程被操作系统挂起,自旋锁使得线程在没有取得锁时不被挂起,执行一个空循环(所谓自旋),若干空循环后若线程可以获得锁则继续执行,否则被挂起。
    对于锁占用时间短的并发线程有益,对于单线程锁占用时间长的并发程序造成资源浪费。
  • 锁消除
    通过上下文扫描,去除不存在共享资源竞争的锁。
    通过逃逸分析技术做到,开启参数:-XX:+DoEscapeAnalysis -XX:+EliminateLocks。
Java锁系列——3、JVM 对 Synchronized 锁优化 概述 在上篇的博客中,我们提到轻量级锁、偏向锁、重量级锁等概念。在早期的 java 虚拟机中,synchronized 锁基于 monitor 管程对象实现,而 monitor 对象又基于底层操作系统锁来保证同步。这就意味着,所有线程切换时都需要从 用户态 切换到 核心态。这也是早期 synchronized 锁效率低下的主要原因。在 jdk6 之后,jvm 对 syncrhonized 锁进行了一系列优化。本篇博客我们就来整理一下 jvm 都对 synchronized 锁进行了哪些优化。 JVM 对 阅读详情

相关推荐

Java领域JVM的锁升级过程解析

本文旨在全面解析Java虚拟机(JVM)中的锁升级机制,帮助开发者深入理解synchronized关键字背后的实现原理。JVM中锁的四种状态及其转换条件每种锁状态的内存布局和实现机制锁升级对程序性能的实际影响如何根据业务场景优化锁的使用介绍JVM内存模型和并发基础详细解析锁升级的四个阶段通过代码示例和性能测试验证理论探讨实际应用中的最佳实践展望未来发展趋势锁升级(Lock Escalation):JVM根据竞争情况动态调整锁策略的过程偏向锁(Biased Locking)

AI开发架构师 723

并发编程2:Java 加锁的原理和JVM对锁的优化

这篇博客介绍了Java中的同步机制和对象锁,以及如何使用synchronized关键字来实现对共享资源的互斥访问。文章详细解释了ObjectMonitor监视器的工作原理和加锁过程,并探讨了Java对同步机制的优化措施,包括偏向锁、轻量级锁和重量级锁等。此外,文章还介绍了锁粗化、锁消除和分段锁的概念。

不会骑摩托的程序员不是好的摄影师 532

JVM锁优化:Java原生锁的背后!

🏆本文收录于「滚雪球学Java」专栏中,这个专栏专为有志于提升Java技能的你打造,覆盖Java编程的方方面面,助你从零基础到掌握Java开发的精髓。赶紧关注,收藏,学习吧!

**My Coding Family** 923

JVM即时编译器JIT以及常见优化

Java源代码最终想要执行,仅仅通过javac编译为字节码是不够的,因为程序最终执行是在底层的操作系统执行的,而,底层操作系统是不能识别和执行class文件的字节码的,所以还需要进一步的将字节码编译为机器码,默认JVM在运行过程中会通过解析器interpreter来完成这个工作,如下图:因为解释器一边解释一边执行是存在一定的性能问题的,特别是对于那种高频执行的热点方法,所以为了能够对于这些热点方法提高程序执行的性能,就引入了JIT,一次性的将字节码翻译为指令码,并存储起来,用时拿就行了。

wang0907的博客 486

Java领域JVM的锁竞争优化策略

在Java的并发编程中,锁是实现线程同步的重要手段。然而,锁竞争会带来性能开销,降低系统的并发性能。本文章的目的在于深入探讨JVM针对锁竞争所采用的优化策略,帮助Java开发者更好地理解和运用这些策略,从而提升程序的性能。文章的范围涵盖了JVM中各种锁竞争优化机制的原理、实现和应用,包括偏向锁、轻量级锁、自旋锁等,以及这些机制在不同场景下的使用和效果分析。本文将按照以下结构进行阐述:首先介绍锁竞争相关的核心概念和它们之间的联系,通过文本示意图和Mermaid流程图进行直观展示;

AI开发架构师 1041

国央企创新负责人如何通过平台实现科研成果的快速识别与转化?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

synchronized锁升级之路: 从无锁到偏向锁再到重量级锁,JVM到底在优化什么

/ 创建多个线程制造激烈竞争,触发重量级锁i < 5;i++) {" 持有锁时Mark Word:");try {| 当前状态 | 升级条件 | 目标状态 | 升级成本 || 无锁 | 首次被线程获取 | 偏向锁 | 低(CAS设置ThreadID) || 偏向锁 | 另一线程竞争 | 轻量级锁 | 中等(需安全点+撤销) || 轻量级锁 | 自旋失败/竞争激烈 | 重量级锁 | 高(内核态切换) || 重量级锁 | 无法降级 | 重量级锁 | - |fill:#333;

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1212

Win11大版本更新失败:系统保留分区空间不足的终极解决方案

本文针对Windows 11大版本更新时遇到的“系统保留分区空间不足”错误,提供了详细的诊断与解决方案。核心问题在于EFI系统分区(ESP)空间过小,导致更新失败。文章重点介绍了使用傲梅分区助手等第三方工具安全扩展EFI分区的完整步骤,并提供了手动清理、使用安装介质修复等替代方案,帮助用户彻底解决更新障碍,顺利完成Win11升级。

weixin_29280219的博客 950

【深度解析】从JVM视角看Java线程与锁优化

fill:#333;color:#333;color:#333;fill:none;监控预警定期jstack分析设置锁超时时间监控线程阻塞时间锁优化策略优先选择无锁设计减小锁粒度缩短锁持有时间使用读写分离选择合适并发容器CAS操作原子变量拆分大锁为小锁尽快释放锁资源图7: 锁优化最佳实践总结优先考虑无锁方案(原子类、并发容器)尽量减小同步范围和使用细粒度锁监控和分析生产环境的锁竞争情况根据实际场景选择合适的锁策略。

✨ 欢迎来唠嗑、切磋、一起成长!👋 1192

SDFCOM_SWC警告深度剖析:从assign短路到时序标注失效的链路追踪

本文深入剖析了SDFCOM_SWC警告的根源,从assign短路到时序标注失效的全链路追踪。通过分析RTL设计中的assign语句陷阱、综合阶段的优化变形以及PrimeTime生成SDF文件的视角,提出了重构RTL设计、警告抑制和SDF生成优化等解决方案,帮助工程师有效避免时序标注问题。

weixin_42519985的博客 363

【ROS学习笔记】8.话题消息(Message)的定义与使用

ROS学习笔记8——话题消息(Message)的定义与使用

takedachia的博客 9548

JVM技术总结之六——JVM的锁优化

接上篇《JVM技术总结之五——JVM逃逸分析》 六. JVM 的锁优化 参考地址: 《java 中的锁 – 偏向锁、轻量级锁、自旋锁、重量级锁》 《彻底搞懂synchronized(从偏向锁到重量级锁)》 《synchronized实现原理》 在介绍 JVM 锁优化之前,首先明确几个概念,用于后续的介绍。 6.1 线程状态切换 由于需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,或者获取外围设备的数据,CPU 划分出两个权限等级:用户态和内核态。 内核态:CPU 可以访问内存所有.

琦小虾的代码世界 1394

MySQL服务启动失败?手把手教你排查NET HELPMSG 3534错误(附完整修复流程)

本文针对Windows平台上MySQL服务启动失败并提示NET HELPMSG 3534错误的常见问题,提供了系统性的排查与修复指南。文章深入剖析了错误本质,并手把手教你通过查看MySQL错误日志、检查并初始化数据目录、修正Windows服务配置、排查my.ini配置文件陷阱等核心步骤,彻底解决这一棘手问题,帮助开发者和运维人员快速恢复数据库服务。

wdx0123456的博客 894

JVM对synchronized的优化——锁膨胀

文章目录Java对synchronized的优化——锁膨胀前言锁标志位锁膨胀的流程 Java对synchronized的优化——锁膨胀 前言 通常我们在synchronized(…)中传一个对象,即可实现加锁,非常简单。而使用锁,常见的问题就是效率慢。在较早期的Java中synchronized会直接调用系统的重量级互斥锁(monitor)来实现加锁,效率较慢。锁膨胀则是针对该问题的优化方案:由...

蒋含竹的博客 2380

HyperLynx(二十二)DDR(五)DDRx总线时序模型设计

DDR3 的数据选通信号与时钟信号的频率是一样的,在数据选通信号写操作时,控制器典型的输出方式是数据选通信号边沿与时钟近似对齐。该界面中显示了所有需要编辑的参数,包括地址/命令信号的时序、控制信号的时序、读和写操作的数据选通和数据信号时序、写操作的数据选通和数据掩码信号时序,以及建立和保持时间的降额参数。由于DDRx总线对时序的要求非常严格,随着速率的提升,时序的要求会更高。反之也是一样的,如果数据选通信号的上升沿在时钟信号上升沿的后面到达 DRAM,那么数据选通信号的下降沿就会在时钟信号的前面到达。

小幽余生不加糖 1936

手把手教你学PCIE--基本概念:PCIe 初始化流程概述

硬件上电复位:系统上电时,所有 PCIe 设备都会进行复位。链路训练(Link Training):主机和设备之间通过链路训练状态机(LTSSM)协商链路参数(如速度和宽度)。配置空间访问:主机通过配置空间读写来发现和配置设备。资源分配:主机为设备分配内存映射 I/O 区域(BARs)、中断向量等资源。驱动程序加载和高级配置:操作系统加载设备驱动程序,并进行更高级的配置和状态监控。硬件上电复位:确保所有设备处于已知的良好状态。链路训练:主机和设备通过 LTSSM 协商链路速度和宽度。

MHD0815的博客 1374

由JVM深入了解Java的线程安全与锁优化

目录 •写在前面 •线程安全 Java语言中的线程安全 线程安全的实现方法 •锁优化 自旋锁与自适应自旋 锁消除 锁粗化 轻量级锁 偏向锁 •写在前面 讲道理,在谈及线程安全以及锁优化之前,需要先搞清楚啥是线程,像那些硬概念这里我就不多说,什么线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源,又可以独立调度(...

BoCong-Deng的博客 1万+

华为OD机试真题 新系统【查找能被整除的最大整数】

华为OD新系统机试真题【查找能被整除的最大整数】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【查找能被整除的最大整数】

qq_45776114的博客 672

深入解析synchronized锁消除:JVM的智能优化之道

锁消除技术体现了JVM设计的几个重要原则: 空间换时间:通过运行时分析获取优化机会 模式识别:识别可预测的执行模式 安全优先:在保证线程安全的前提下进行优化 分层优化:不同编译器阶段实施不同级别优化 这种优化机制使得开发者可以保持代码的线程安全性,而将性能优化交给JVM处理,实现开发效率与运行效率的平衡。

weixin_51786043的博客 709

大模型选型实战:为OpenClaw匹配最优“大脑”的全维度考量

大模型不是越贵越好,也不是参数越高越好,适合自己的使用场景才是最好的。按照我的方法,先明确自己的需求,再选对应的模型,配置多模型自动路由,既能保证体验,又能最大限度降低成本。我自己用这套配置用了半年多,不管是写文章、写代码还是处理复杂问题,都完全够用,成本也很低,大家可以参考一下。如果不知道选什么模型,可以在评论区说一下你的使用场景。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 343

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

解析 JVM 的锁粗化与锁消除优化技术

在 Java 多线程编程领域,锁机制是保障线程安全的核心手段,但频繁且不合理的锁使用会带来性能瓶颈。为化解这一难题,Java 虚拟机(JVM)引入了锁粗化与锁消除等优化技术。这些技术在提升程序运行效率、降低锁开销方面成效显著,理解与运用它们,对编写高性能多线程 Java 程序至关重要。

潜意识Java的博客 1105

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java 锁优化详解

锁优化是提升并发程序性能的重要手段,Java 提供了多种锁优化机制,如锁粗化、锁消除、偏向锁、自旋锁等。通过合理使用这些优化技术,开发者可以减少锁的开销,提高程序的并发性能。在实际开发中,选择合适的锁策略和优化方法至关重要。对于读多写少的场景,可以使用读写锁;对于频繁访问的共享资源,可以使用无锁的并发类。理解锁优化的原理和最佳实践,可以帮助开发者编写高效的并发程序。

m0_38053034的博客 1192

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JVM系列之synchronized锁优化

每年“金三银四、金九银十”都是投简历的好时机,博主会在这些阶段去投递简历,看看市面上的互联网公司的要求,再调整自己技术栈学习的顺序,在最近的投递的互联网公司(包含一线、超一线、中小型)对于java开发岗位的要求基本离不开“分布式/微服务开发”、“精通java”、“jvm”、“sql调优”、“常见中间件”、“springboot开发”、“算法和数据结构”、“计算机网络”。看了这些个要求,内心浮现出了几个大字:“我顶你个肺”生活还是要继续,抱怨完就业情形,我嘎嘎就更新了jvm系列文章 参考书籍:“深入理解Jav

a_ittle_pan的博客 718

JVM对Java的原生锁做了哪些优化?

此时,JVM会在锁对象的对象头中记录指向线程栈中锁记录的指针,以及用于保存原始对象的指针。这样,当一个线程尝试获取该锁时,JVM会将该线程的栈帧中的锁记录与锁对象头中的指针进行比较。否则,表示有其他线程争夺该锁,此时JVM会将锁升级为重量级锁。当多个线程同时访问该方法时,JVM会根据锁的状态来选择使用偏向锁、轻量级锁或重量级锁。当一个线程获取锁后,JVM会将锁的对象头标记为偏向锁。这种情况下,锁的获取和释放不需要额外的开销,因为偏向锁会记录线程ID,使得在该线程持有锁期间,其他线程无法获取该锁。

Aa112233aA1的博客 561
上一篇: Java Concurrency 2: ThreadPool
下一篇: Redis 1-Basic
HackerDotCn
博客等级 码龄11年 3粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值