锁的优化

JAVA虚拟机(JVM)底层原理 JVM的详细全解,全面理解JVM的组成及其原理 阅读详情

以下大部分内容转自  http://blog.youkuaiyun.com/u010425776/article/details/58598307

 

 

 

 

 

自旋锁

  • 背景:互斥同步对性能最大的影响是阻塞,挂起和恢复线程都需要转入内核态中完成;并且通常情况下,共享数据的锁定状态只持续很短的一段时间,为了这很短的一段时间进行上下文切换并不值得。
  • 原理:当一条线程需要请求一把已经被占用的锁时,并不会进入阻塞状态,而是继续持有CPU执行权等待一段时间,一直循环在那里看是否该自旋锁的保持者已经释放了锁,如果释放锁就拿锁,如果还没释放锁就继续循环,该过程称为『自旋』
  • 优点:由于自旋等待锁的过程线程并不会引起上下文切换,因此比较高效;
  • 缺点:自旋等待过程线程一直占用CPU执行权但不处理任何任务,因此若该过程过长,那就会造成CPU资源的浪费(可以加个参数设置最多持续尝试次数)
  • 自适应自旋:自适应自旋可以根据以往自旋等待时间的经验,计算出一个较为合理的本次自旋等待时间。

锁清除

 

编译器会清除一些使用了同步,但同步块中没有涉及共享数据的锁,从而减少多余的同步。

锁粗化

若有一系列操作,反复地对同一把锁进行上锁和解锁操作,编译器会扩大这部分代码的同步块的边界,从而只使用一次上锁和解锁操作。

轻量级锁

  • 本质:使用CAS取代互斥同步。
  • 背景:『轻量级锁』是相对于『重量级锁』而言的,而重量级锁就是传统的锁。
  • 轻量级锁与重量级锁的比较: 
    • 重量级锁是一种悲观锁,它认为总是有多条线程要竞争锁,所以它每次处理共享数据时,不管当前系统中是否真的有线程在竞争锁,它都会使用互斥同步来保证线程的安全;
    • 而轻量级锁是一种乐观锁,它认为锁存在竞争的概率比较小,所以它不使用互斥同步,而是使用CAS操作来获得锁,这样能减少互斥同步所使用的『互斥量』带来的性能开销
  • 实现原理: 
    • 对象头称为『Mark Word』,虚拟机为了节约对象的存储空间,对象处于不同的状态下,Mark Word中存储的信息也所有不同。
    • Mark Word中有个标志位用来表示当前对象所处的状态。
    • 当线程请求锁时,若该锁对象的Mark Word中标志位为01(未锁定状态),则在该线程的栈帧中创建一块名为『锁记录』的空间,然后将锁对象的Mark Word拷贝至该空间;最后通过CAS操作将锁对象的Mark Word指向该锁记录;
    • 若CAS操作成功,则轻量级锁的上锁过程成功;
    • 若CAS操作失败,再判断当前线程是否已经持有了该轻量级锁;若已经持有,则直接进入同步块;若尚未持有,则表示该锁已经被其他线程占用,此时轻量级锁就要膨胀成重量级锁。
  • 前提:轻量级锁比重量级锁性能更高的前提是,在轻量级锁被占用的整个同步周期内,不存在其他线程的竞争。若在该过程中一旦有其他线程竞争,那么就会膨胀成重量级锁,从而除了使用互斥量以外,还额外发生了CAS操作,因此更慢!

偏向锁

  • 作用:偏向锁是为了消除无竞争情况下的同步原语,进一步提升程序性能。
  • 与轻量级锁的区别:轻量级锁是在无竞争的情况下使用CAS操作来代替互斥量的使用,从而实现同步;而偏向锁是在无竞争的情况下完全取消同步。
  • 与轻量级锁的相同点:它们都是乐观锁,都认为同步期间不会有其他线程竞争锁。
  • 原理:当线程请求到锁对象后,将锁对象的状态标志位改为01,即偏向模式。然后使用CAS操作将线程的ID记录在锁对象的Mark Word中。以后该线程可以直接进入同步块,连CAS操作都不需要。但是,一旦有第二条线程需要竞争锁,那么偏向模式立即结束,进入轻量级锁的状态。
  • 优点:偏向锁可以提高有同步但没有竞争的程序性能。但是如果锁对象时常被多条线程竞争,那偏向锁就是多余的。
  • 偏向锁可以通过虚拟机的参数来控制它是否开启。

 

Java中的锁优化 锁优化是提高程序并发性能的关键手段,包括使用合适的锁类型如读写锁、可重入锁以适应不同场景;减小锁粒度,将锁作用范围限制在小范围代码或数据上以减少锁竞争;锁分离,将不同功能或数据用不同锁管理以避免不必要竞争;锁粗化,合并细小锁减少请求释放次数但需注意锁竞争;使用乐观锁,基于版本号控制并发,适合写少读多场景;以及使用无锁算法,通过原子操作、CAS等保证数据正确性,适合高并发低延迟场景。 阅读详情

相关推荐

JVM中的锁优化

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

cv:小怪 1146

「JVM」知识点详解一:JVM运行原理详解

JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由。

2401_85763843的博客 1333

JVM工作原理学习笔记

JVM工作原理学习笔记,感兴趣的小伙伴们可以下载来看看。

JVM运行原理

Java虚拟机(Java Virtual Machine,JVM)是Java平台的核心组件之一,它提供了一个在特定硬件和操作系统上运行Java字节码的虚拟环境虚拟机(Virtual Machine),虚拟计算机。他是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。VMware属于系统虚拟机,完全对物理计算机的仿真,提供一个可运行完整操作系统的平台。程序虚拟机的典型代表是java虚拟机,专门为执行某个计算机程序而设计。

2302_78916778的博客 1115

JVM 工作原理

JVM的生命周期 JVM的体系结构 JVM类加载器 JVM执行引擎 JVM运行时数据区 JVM垃圾回收 问题

FreeRTOS:卡在configASSERT( ( pxQueue ) )问题的解决

FreeRTOS卡在configASSERT( ( pxQueue ) )问题的解决

qq_42007164的博客 9564

Java并发编程的艺术(十三)——锁优化

自旋锁 背景:互斥同步对性能最大的影响是阻塞,挂起和恢复线程都需要转入内核态中完成;并且通常情况下,共享数据的锁定状态只持续很短的一段时间,为了这很短的一段时间进行上下文切换并不值得。 原理:当一条线程需要请求一把已经被占用的锁时,并不会进入阻塞状态,而是继续持有CPU执行权等待一段时间,该过程称为『自旋』。 优点:由于自旋等待锁的过程线程并不会引起上下文切换,因此比较高效; 缺点:自旋等待过程线程

大闲人柴毛毛 4448

AURIX™ TC3xx 调试口保护 secure debug

AURIX™ TC3xx 调试口保护 secure debug UCB_DBG_ORIG and UCB_DBG_COPY Content 使用Debug Password 保护调试接口设置 项目硬件接口保护方案 hexview Lock using UDE Unlockusing UDE Lock using Lauterbach Unlock using Lauterbach

2301_76563067的博客 6857

深入剖析Java虚拟机(JVM):工作原理、内存管理与优化全解析

一、引言(Java Virtual Machine,简称JVM)是运行Java程序的抽象计算机,是Java语言的运行环境。它提供了Java程序运行所需的内存管理、垃圾收集、类加载等核心功能。理解JVM对于Java开发人员来说至关重要,它有助于我们优化程序性能、解决内存泄漏等问题。

qq_44664868的博客 3645

NPP/VIIRS夜间灯光数据:从下载到应用的完整指南

本文提供了NPP/VIIRS夜间灯光数据从下载、处理到应用的完整实战指南。详细介绍了如何从官方源获取数据、解读文件结构、进行坐标校正与数据清洗,并深入探讨了其在城市扩张监测、社会经济指标估算、重大事件影响评估等领域的核心应用。文章旨在帮助研究者与从业者快速掌握这一强大的空间数据,将其转化为研究中的实用工具。

gpu4optimizer的博客 862

aubo i5 + realsense D435i识别抓取实践二

aubo i5 + realsense D435i识别抓取实践二前言一、手眼标定是什么?二、标定软件安装1.aruco_ros安装2.vision_visp安装3.easy_handeye安装4.realsense驱动安装5.安装realsense ROS软件包三、配置1.launch文件修改2.打印二维码四、手眼标定1.启动launch文件2.标定步骤3.发布tf关系 前言 前面配置好了aubo机械臂的ROS软件包,机械臂可以正常运行后,接下来我们进行机械臂与相机的手眼标定。手眼标定分为eye_on_ha

转角 6373

synchronized锁升级及锁优化

一、锁升级 在1.6之前java中不存在只存在重量级锁,这种锁直接对接底层操作系统中的互斥量(mutex),这种同步成本非常高,包括操作系统调用引起的内核态与用户态之间的切换。线程阻塞造成的线程切换等。因此在jdk 1.6中将锁分为四种状态:由低到高分别为:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。 1. 偏向锁。 什么是偏向锁呢?为什么要引入偏向锁呢? ​ 偏向锁是如果一个线程获取到了偏向锁,在没有其他线程竞争的情况下,如果下次再执行该同步块时则只需要简单判断当前偏向锁所偏向的对象是否

Apollo的博客 1431

一步步教你使用 NVIDIA 推出的全新GPU加速求解器 cuOpt:解锁超高效率的求解体验

未完成

Linshaodan520的博客 869

Java 锁优化详解

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

m0_38053034的博客 1192

MATLAB离线附加功能包下载与安装教程

本文介绍如何下载与安装MATLAB离线附加功能包,便于大家更加高效的使用MATLAB。

加斯顿工程师的博客 1万+

087、DAMO-YOLO Efficient-RepGFPN:重参数化加皇后融合加黄金分割的创新 Neck

DAMO-YOLO的Efficient-RepGFPN创新性Neck结构摘要: 该结构通过三重创新提升目标检测性能: 重参数化卷积:训练时多分支(3x3卷积+1x1卷积+BN分支)提升特征表达能力,推理时合并为单路3x3卷积保证效率; 皇后融合机制:采用可学习权重对不同尺度特征进行自适应加权融合,而非简单相加,通过Softmax归一化权重实现特征选择; 黄金分割连接:优化特征金字塔层间连接方式,按比例分配相邻层特征权重(如P3:P5≈0.618:0.382),减少冗余连接噪声。 实验表明,该结构有效解决了传

ai技术增长的博客 102

synchronized及锁优化

1. synchronized是基于进入与退出监视器对象(Monitor)来实现的,每个java对象都有一个Monitor对象。 2. Monitor依赖于操作系统底层实现 3.开启偏向锁的情况下(默认是开启的),锁状态演化顺序为 偏向锁,轻量级锁,重量级锁 4. 锁的各种优化措施,是为了避免线程从用户态进入到内核态,从而提高效率

他叫阿来 1198

【异常】安装hermes-agent时Git克隆大仓库报错:error: RPC failed; curl 92 HTTP/2 stream 5 was not closed cleanly: CAN

摘要:本文分析了Ubuntu服务器执行Git递归克隆时出现的网络传输中断错误(HTTP/2流异常关闭、数据截断)。主要原因是网络限制、协议兼容问题和缓冲区不足。提供了四种解决方案:1)扩大Git HTTP缓冲区;2)切换为HTTP/1.1协议;3)采用浅克隆+分步拉取子模块;4)网络优化措施。重点推荐浅克隆分步拉取作为最有效方案,所有方法无需重启即可生效,可快速解决大仓库递归克隆失败问题。

奶爸的编程之路,也就一周冷个三天 670

锁优化

为了在线程之间更高效的共享数据,以及解决竞争问题,从而提高程序的执行效率,实现了各种锁优化技术。 锁的优化策略 编码过程中可采取的锁优化的思路有以下几种: 1、减少锁持有时间 例如:对一个方法加锁,不如对方法中需要同步的几行代码加锁; 2、减小锁粒度 例如:ConcurrentHashMap采取对segment加锁而不是整个map加锁,后来又对node加锁,提高并发性; 3、锁分离...

洞玄之境的博客 896

NTscan扫描工具

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

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

锁优化(锁升级、锁粗化、锁消除)

锁优化 阿里开发手册 synchronized 锁优化的背景 用锁能够实现数据的安全性,但是会带来性能下降。 无锁能够基于线程并行提升程序性能,但是会带来安全性下降。 要在性能与安全找到平衡点: jdk6引入偏向锁、轻量级锁 Synchronized的性能变化 Java5之前,用户态和内核态之间的切换 java5以前,只有Synchronized,这个是操作系统级别的重量级操作 重量级锁,假如锁的竞争比较激烈的话,性能下降‘ java的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操

我的博客 2054

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JVM锁与锁优化

编码中进行锁优化: 锁细化,减少锁持有的时间,在一个线程的代码之中,尽量不要对一个方法进行加锁,而是抽离出一个方法中的共享数据,只对方法中的这部分数据代码加锁,这样能减少加锁范围。防止在出现多线程竞争的时候,多个线程对同一个锁进行竞争,而持有锁的代码过长导致执行时间很长,处于阻塞状态的线程等待时间过长,阻塞状态的线程所处理的业务响应速度下降。 锁分离,根据代码同步操作的性质,分离锁,比如说,在...

E_N_T_J的博客 530

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

锁优化的方式

JSON中的Gson类库   JSON (JavaScript Object Notation) 是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便;解析和生成的方式很多。JSON支持字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:  对象表示为键值对,键/值对用双引号 “” 包裹,使用冒号 : 分隔。不同键值对之间用逗号,分割,花括号保存...

ThreeAspects的博客 1707

Synchronized锁优化

文章目录Synchronized锁优化(1)引言(2)Java对象的内存布局(3)偏向锁(4)轻量级锁(5)重量级锁 Synchronized锁优化 (1)引言 在JDK1.5之前,synchronized的底层实现都是重量级的,借助操作系统底层实现,也称之为synchronized为重量级锁,在JDK1.5之后,对Synchronized进行了各种优化,实现的原理是锁升级的过程,有了偏向锁、轻量级锁和重量级锁的概念。 (2)Java对象的内存布局 在Java中,创建一个对象后,在JVM中,对象在内存

WYSCODER的博客 1326

Java 锁优化

Java锁优化 首先解释一下,Java中,对锁的优化,主要是优化 sychronized 关键字,优化是在JVM层面,并且是在JDK5之后,因为之前 sychronized 的运行效率太低 先看看编译之后的Class文件 在JVM中,每个对象都会有一个对象头的数据Mark Word,该对象头中存储了对象的哈希码,对象分代年龄,锁标识,还有偏向模式 锁状态 哈希码 分代年龄 偏向模式 标识位 未锁定 01 轻量锁定 00 重量锁定 10 GC标识

qq_38937658的博客 279
上一篇: RabbitMQ实现分布式事务(最终一致性)
下一篇: 跨域
AAA821
博客等级 码龄14年 19粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值