并发编程--偏向锁、轻量级锁

Java并发编程:Synchronized底层优化(轻量级锁、偏向锁) 否则说明多个线程竞争锁,轻量级锁就要膨胀为重量级锁,锁标志的状态值变为“10”,Mark Word中存储的就是指向重量级锁(互斥量)的指针,后面等待锁的线程也要进入阻塞状态。引入偏向锁是为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径,因为轻量级锁的获取及释放依赖多次CAS原子指令,而偏向锁只需要在置换ThreadID的时候依赖一次CAS原子指令(由于一旦出现多线程竞争的情况就必须撤销偏向锁,所以偏向锁的撤销操作的性能损耗必须小于节省下来的CAS原子指令的性能消耗)。如果竞争失败,执行(4)。 阅读详情

锁的升级与对比

Java SE 1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,在 Java SE 1.6中,锁一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状 态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏 向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高 获得锁和释放锁的效率。

偏向锁

大多数情况下,锁不仅不存在多线程竞争,而且总是由同 一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。

当一个线程访问同步块并 获取锁时,会在对象头和栈帧中的锁记录里存储锁偏向的线程ID,以后该线程在进入和退出 同步块时不需要进行CAS操作来加锁和解锁,只需简单地测试一下对象头的Mark Word里是否 存储着指向当前线程的偏向锁。

  • 如果测试成功,表示线程已经获得了锁。
  • 如果测试失败,则需 要再测试一下Mark Word中偏向锁的标识是否设置成1(表示当前是偏向锁):
    • 如果没有设置,则 使用CAS竞争锁;
    • 如果设置了,则尝试使用CAS将对象头的偏向锁指向当前线程。

偏向锁的撤销:

偏向锁使用了一种等到竞争出现才释放锁的机制,所以当其他线程尝试竞争偏向锁时, 持有偏向锁的线程才会释放锁。

偏向锁的撤销,需要等待全局安全点(在这个时间点上没有正 在执行的字节码)。

  • 它会首先暂停拥有偏向锁的线程,然后检查持有偏向锁的线程是否活着:
    • 如果线程不处于活动状态,则将对象头设置成无锁状态;
    • 如果线程仍然活着,拥有偏向锁的栈 会被执行,遍历偏向对象的锁记录,栈中的锁记录和对象头的Mark Word要么重新偏向于其他 线程,要么恢复到无锁或者标记对象不适合作为偏向锁,最后唤醒暂停的线程。

偏向锁的获得和撤销流程:

在这里插入图片描述

注意: 偏向锁在Java 6和Java 7里是默认启用的,但是它在应用程序启动几秒钟之后才激活,如有必要可以使用JVM参数来关闭延迟:-XX:BiasedLockingStartupDelay=0。

如果你确定应用程序里所有的锁通常情况下处于竞争状态,可以通过JVM参数关闭偏向锁:-XX:- UseBiasedLocking=false,那么程序默认会进入轻量级锁状态。

轻量级锁

轻量级锁加锁:

线程在执行同步块之前,JVM会先在当前线程的栈桢中创建用于存储锁记录的空间,并将对象头中的Mark Word复制到锁记录中,官方称为Displaced Mark Word。然后线程尝试使用CAS将对象头中的Mark Word替换为指向锁记录的指针:

  • 如果成功,当前线程获得锁;
  • 如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁。

轻量级锁解锁:

轻量级解锁时,会使用原子的CAS操作将Displaced Mark Word替换回到对象头:

  • 如果成功,则表示没有竞争发生;
  • 如果失败,表示当前锁存在竞争,锁就会膨胀成重量级锁。

下图为两个线程同时争夺锁,导致锁膨胀的流程图。
在这里插入图片描述

因为自旋会消耗CPU,为了避免无用的自旋(比如获得锁的线程被阻塞住了),一旦锁升级成重量级锁,就不会再恢复到轻量级锁状态。当锁处于这个状态下,其他线程试图获取锁时,都会被阻塞住,当持有锁的线程释放锁之后会唤醒这些线程,被唤醒的线程就会进行新一轮的夺锁之争。

锁的优缺点对比

在这里插入图片描述

Figma做原型设计一篇教会你,全栈软件开发必备技能,前后端岗位锐减找工作的底牌 本文介绍了使用Figma进行前端应用原型设计的方法与优势。Figma作为主流设计工具,能够满足大多数应用系统的原型设计需求,强调系统设计应保持简洁合理。文章详细说明了Figma的基本操作流程,包括创建Frame页面、组件使用、交互设置等核心功能,并指出命名规范的重要性。同时对比了Axure、墨刀等其他设计工具的特点,建议根据具体需求选择合适的平台。最后强调原型设计主要关注交互功能展示,业务逻辑应通过需求文档表述。整体而言,Figma凭借其简洁高效的特点,已成为原型设计的优选工具。 阅读详情

相关推荐

国税局发票查验中英文验证码识别,识别率95.2%

国税验证码识别方法介绍

onedayismyway的博客 3135

理解Java锁升级:无锁 、偏向锁 、 轻量级锁 、 重量级锁

深入理解Java锁升级

weixin_44121790的博客 642

Android布局基础与UI设计入门:打造精美应用界面

恭喜你!现在你已经掌握了Android UI开发的基础知识,包括各种布局类型、常用控件的使用以及一些UI优化技巧。这些知识将帮助你设计出既美观又实用的Android应用界面。

m0_65382359的博客 2057

偏向锁、轻量级锁、重量级锁之间的变迁

对象锁共有四种状态:无锁、偏向锁、轻量级锁、重量级锁,锁竞争程度依次加重。 对象锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。 自旋是一种获取锁的策略,存在于获取轻量级锁的过程中,不是一种锁,java的对象锁只有上述四种。 假设现在有一个对象O,刚刚被新建,处于无锁状态。此时线程A尝试获取对象锁,如果此时jvm已经开启了偏向锁,那么线程A会尝试CAS操作将自己的线程Id...

joenqc的博客 1011

实战避坑:在Ubuntu 22.04上配置NVIDIA GPU Direct RDMA时,必须搞清的P2P DMA与IOMMU那些事

本文深入探讨在Ubuntu 22.04上配置NVIDIA GPU Direct RDMA时P2P DMA与IOMMU的关键问题,解析PCIe架构中的地址转换、P2P DMA与标准DMA的区别,以及IOMMU对性能的影响。通过实战案例和调优建议,帮助用户避免常见配置陷阱,提升AI训练集群的数据传输效率。

weixin_33720078的博客 444

从RadixTree到哈希表:深入对比SGLang和vLLM的Prefix Cache实现差异

本文深入对比了SGLang与vLLM在大语言模型推理服务中实现Prefix Cache(前缀缓存)的两种核心方案。SGLang采用基于Radix Tree的RadixAttention,支持任意长度前缀的精确匹配与灵活复用;vLLM则采用基于哈希表的方案,深度集成于PagedAttention,实现简洁但要求块级精确对齐。文章剖析了二者在设计哲学、内存管理、适用场景及集群级优化(如Prefix Cache Aware Routing)上的关键差异,为高性能LLM服务的技术选型提供决策依据。

blockchain9miner的博客 956

【Java 会锁】

synchronized 先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现为以下3种形式 对于普通同步方法,锁是当前实例对象 对于静态同步方法,锁是当前类的Class对象 对于同步方法块,锁是synchonized括号里配置的对象 锁升级 JAVA对象头 Java对象头里的Mark Word里默认存储对象的HashCode、分代年龄和锁标记位,这些信息都是与对象自身定义无关的数据,所以Mark Word被设计成一个非固定的数

qq_35007950的博客 197

Open3D (C++) 计算点云坐标最值及其索引

使用C++版本的Open3D计算点云最值点及其对应的下标索引

点云侠的博客 730

Java中的偏向锁、轻量级锁和重量级锁

在 JDK1.6 版本之前,所有的 Java 内置锁都是重量级锁。重量级锁会造成 CPU 在用户态与核心态之间频繁切换,所以代价高、效率低。JDK1.6 版本为了减少获得锁和释放锁所带来的性能消耗,引入了“偏向锁”和“轻量级锁”实现。......

学无止境的博客 2178

Allegro23.1新功能之软件自带阻抗计算工具操作指导

Allegro升级到了23.1后,软件新增了一个自带阻抗计算的功能,如下图。Propagation velocity:传输速度,单位是光速的多少倍。Dielectric constant输入介电常数,这里使用常规4。新功能之软件自带阻抗计算工具。如何使用,具体操作如下。

weixin_54787054的博客 785

【Unity程序技巧】Unity中单例模式管理器

单例模式(Singleton Pattern)是 最简单的设计模式之一

秩沅 1659

Java偏向锁/轻量级锁/重量级锁及锁的升级

1 前言 在Java SE1.6之前,synchronized一直都是重量级锁,如果某个线程获得了锁,其它获取锁的线程必须阻塞。在高并发的情况下,会有大量线程阻塞,导致系统响应速度急剧下降;同时不断的获取和释放锁也会导致线程不断切换,给系统造成较大的负担。在Java SE1.6之后,为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。这些锁就存在锁对象的对象...

奋进的小白粥 894

springboot+vue项目基础开发(12)vue项目的搭建

在src目录下新建 api,utils,views文件夹。删除componets目录下自动生成的所有文件。在utils文件夹下创建request.js。启动项目,记得是要在管理员下启动。

m0_58498702的博客 153

java并发编程之Monitor、无锁、偏向锁、轻量级锁和重量级锁

一、Monitor 在理解monitor之前,先来了解一下Java对象头: 对象头 对象头是java中对象都具有的属性,是jvm在编译和运行阶段读取的信息。对象头包含三个部分: mark word 指针向类的指针 数组的长度(只有数组的对象用到) 以32位虚拟机为例: 1.概念 Monitor 被翻译为监视器或管程,可以理解为一个同步工具或一种同步机制,通常被描述为一个对象。每一个Java对象就有一把看不见的锁(C语言实现),称为内部锁或者Monitor锁。如果使用 synchronized

weixin_45803046的博客 1614

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

Java并发编程:浅谈偏向锁、轻量级锁、自旋优化、锁膨胀、锁重入机制

一、介绍 1、 我们知道,在java中可以通过Synchronized对对象加锁、其原理是通过对对象内部的一个叫做监视器(monitor)的来实现的,但是线程之间的切换是需要操作系统通过从用户态转成核心态来实现的,状态之间的转换需要比较长的时间,这就是为什么synchronized效率比较低的原因。Java从JDK6开始引入了“轻量级锁”和“偏向锁”来减少频繁的锁释放和锁获得所带来的性能上的消耗,所以在jdk6中,锁一共有4种状态:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。这些锁会随着...

sicaujh的博客 360

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JUC并发编程01——谈谈锁机制:轻量级锁、重量级锁、偏向锁、锁消除与锁优化

1.为什么要有并发编程 计算机的cpu与I/O的效率并不是完全一致的,CPU的处理速度快时,在进行I/O操作时,可能会导致CPU空闲的状态,为了最打程度的利用cpu的资源,开发人员创造了并发编程,进程通过轮换可以最大程度的利用cpu的资源,同时给用户进程在同步执行的错觉。但是进程之间并不会共享数据,同时上下文的切换也比较耗时,线程横空出世,同一个进程中的不同线程之间内存共享一片内存区域,线程上下文切换也很轻量级。juc是java官方提供的线程操作的jar包,可以尽可能的降低我们并发编程的难度。 2.锁机制

半旧518的博客 930

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【并发编程系列2】synchronized锁升级原理分析(偏向锁-轻量级锁-重量级锁)

这样,等真的沉下心来学习,不至于被找资料分散了心神。另外,给大家安排了一波学习面试资料:以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!这样,等真的沉下心来学习,不至于被找资料分散了心神。另外,给大家安排了一波学习面试资料:[外链图片转存中…(img-C5NHr9u5-1712729837496)]

Y1567409的博客 351

Java并发编程三:Synchronized底层优化(偏向锁、轻量级锁等各种锁)

Java并发编程:Synchronized底层优化(偏向锁、轻量级锁等) 目录 Java并发编程:Synchronized底层优化(偏向锁、轻量级锁) 一,概述 二,CAS算法 三,Java对象的对象头,以及Mark Word 四,各种锁 五,在应用层提高锁效率的方案 六、总结 一,概述 什么是java的锁? 1,java中使用synchronized关键字来实现同步功能...

zhuiqiuuuu的博客 386

Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)

Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁、偏向锁) Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) Java 并发编程:volatile的使用及其原理 一、重量级锁   上篇文章中向大家介绍了Synchronized的用法及其实现的原理。现在我们应该知道,Synchr..

绝圣弃智-零的博客 329

Java并发编程—Synchronized底层优化(偏向锁、轻量级锁)

原文作者:Matrix海 子 原文地址:Java并发编程:Synchronized底层优化(偏向锁、轻量级锁) 目录 一、重量级锁 二、轻量级锁 三、偏向锁 四、其他优化 五、总结 一、重量级锁 上篇文章中向大家介绍了Synchronized的用法及其实现的原理。现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到..

sanmi8276的博客 387

Java 并发编程中的 “锁“ 机制:偏向锁、轻量级锁、重量级锁区别

撤销过程需要暂停持有偏向锁的线程,检查其状态并更新锁标志,这个过程本身存在一定开销,因此在多线程频繁竞争的场景下,偏向锁反而会降低性能,此时通常建议通过 JVM 参数-XX:-UseBiasedLocking禁用偏向锁。Java 的锁机制从偏向锁的 “无竞争优化”,到轻量级锁的 “短竞争自旋”,再到重量级锁的 “强竞争阻塞”,形成了一套渐进式的性能优化方案。因此,重量级锁的性能远低于偏向锁和轻量级锁,仅适合线程竞争激烈且持有锁时间较长的场景,例如复杂计算、IO 操作等。偏向锁:消除无竞争场景的性能损耗​。

2509_93051135的博客 319

并发编程之五:synchronized底层原理、monitor、轻量级锁、偏向锁、wati/notify/notifyAll、join、状态转换

并发之共享模型之:管程synchronized底层原理Monitorjava对象头monitor(锁)synchronized原理进阶小故事轻量级锁膨胀锁wait/notify线程状态转换活跃性Lock synchronized底层原理 我们从底层原理来分析synchronized,进一步的了解它。 下面的内容会非常的枯燥和无聊,想要学习上乘武学就得耐得住枯燥、无聊和寂寞。 Monitor 学习Monitor之前我们先了解以下java对象头,后面我们会用到java对象头里的知识。 java对象头 通常我们的

java_xxxx的博客 1194
上一篇: Java并发--对象头
下一篇: Docker--安装MongoDB
吴声子夜歌
博客等级 码龄9年 2688粉丝 2271原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值