Synchronized轻量级锁原理

Synchronized的原理及自旋锁,偏向锁,轻量级锁,重量级锁的区别 在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。   锁从宏观上分类,分为悲观锁与乐观锁。 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇... 阅读详情

加锁过程

1.在线程栈中创建一个Lock Record,将其obj(即Object reference)字段指向锁对象。

2.会把锁的Mark Word复制到自己的Lock Record的Displaced Mark Word里面。然后线程尝试直接通过CAS指令将Lock Record的地址存储在对象头的mark word中,如果对象处于无锁状态则修改成功,代表该线程获得了轻量级锁。如果失败,进入到步骤3。

3.如果是当前线程已经持有该锁了,代表这是一次锁重入。设置Lock Record第一部分(Displaced Mark Word)为null,起到了一个重入计数器的作用。然后结束。

4.如果都失败,表示Mark Word已经被替换成了其他线程的锁记录,说明在与其它线程竞争锁,需要膨胀为重量级锁。【这就是轻量级锁升级为重量级锁的时机】

解锁过程

1.遍历线程栈,找到所有obj字段等于当前锁对象的Lock Record。

2.如果Lock Record的Displaced Mark Word为null,代表这是一次重入,将obj设置为null后continue。

3.如果Lock Record的Displaced Mark Word不为null,则利用CAS指令将对象头的mark word恢复成为Displaced Mark Word。如果成功,则continue,否则膨胀为重量级锁。

轻量级锁重入示例图

我们看个demo,在该demo中重复3次获得锁。

synchronized(obj){
    synchronized(obj){
    	synchronized(obj){
    	}
    }
}

轻量级锁什么时候升级为重量级锁?

其实在加锁的时候已经说过了,这里再以一个具体场景说下

  • 线程1获取轻量级锁时会把锁的Mark Word复制到自己的Lock Record的Displaced Mark Word里面。然后线程尝试直接通过CAS指令将Lock Record的地址存储在对象头的mark word中
  • 如果在线程1复制对象头的同时(在线程1CAS之前),线程2也准备获取锁,复制了对象头到线程2的锁记录空间中,但是在线程2在CAS的时候,发现线程1已经把对象头换了,线程2的CAS失败。那么此时就代表发生了锁竞争,准备升级为重量级锁

轻量级锁CAS的问题

1、结论: 没有自旋这回事,只有重量级锁获取失败才会自旋,网上的文章好多都是错的,我个人认为轻量级锁的意义就是在没有线程争用锁时不用创建monitor。 【源码得到的结论,实践才是硬道理】

2、轻量级锁和偏向锁区别: 只要存在竞争就会升级重量级。轻量级锁的存在就是用于线程之间交替获取锁的场景,但是和偏向锁是有区别的啊。一个线程获取偏向锁之后,那么这个锁自然而然就属于这个线程(就算该线程释放了偏向锁也不会改变这把锁偏向这个线程的【也就是之前说的不会修改Thread ID】,这个前提是没有发生过批量重偏向使锁的epoch与其对应class类的epoch不相等)。所以说偏向锁的场景是用于一个线程不断的获取锁,如果把它放在轻量级锁的场景下线程之间交替获取的话会发生偏向锁的撤销的。也就是说在偏向锁的情况下,线程1之前释放了锁,线程2再获取锁,即使此时没有同时锁竞争的情况,依然是要升级为轻量级锁的。而轻量级锁只要没有同时去获取锁,就可以不升级为重量级锁,也就代表你可以不同线程交替获取这个锁。

3、效率上来看偏向锁只有在获取的时候进行一次CAS,以后的释放和获取只需要简单的一些判断操作。而轻量级锁的获取和释放都要都要CAS,单纯的看效率还是偏向锁效率高。

【Java并发】-- synchronized原理 (偏向锁,轻量级锁,重量级锁膨胀过程) 放大了看,会让你惊艳的一张图。 什么是Monitor?可以理解为一个同步工具,也可以描述为一个同步机制。所以java对象天生是一个Monitor, 每个Object对象里面markOop --> monitor() 里可以保存ObjectMonitor对象。 阅读详情

相关推荐

从2-RSS-1U并联踝关节到双足机器人动态行走:雅可比矩阵与力矩控制实践

本文深入探讨了2-RSS-1U并联踝关节在双足机器人动态行走中的关键作用,详细解析了其设计原理、雅可比矩阵的应用及力矩控制实践。通过优化几何参数和控制算法,实现了低转动惯量、高刚度和紧凑设计,显著提升了机器人的行走稳定性和能量效率。文章还分享了从仿真到实物的跨越经验及未来优化方向。

weixin_42641998的博客 597

synchronized原理(轻量级,锁膨胀,自旋,偏向锁)

如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。轻量级锁对使用者是透明的,即语法仍然是。

TiankkTT的博客 1006

数字麦克风PDM信号采集与STM32 I2S接口应用(二)

在使用STM32的数字麦克风I2S接口时,计算采样率让人头疼,芯片手册上没有明确的说法,而手册上的计算方法经过测试却和实验不符。借助搜索引擎,大部分资料都是来自于开发板卖家或开发板论坛,主要是咪头采集然后配置WM89系列解码芯片,然后配合FatFS、MP3解码等模式,主要是讲解I2S录音、存储、放音等。外文资料得到的也寥寥无几,也没有找到讲解STM32数字麦克风配置、计算的文档。加上网上资料转载、抄袭、浅尝辄止的笔记教程,这些更是让检索大海捞针,过程艰辛一言难尽,有些网文三言两语抑或作者都没有搞清楚随手一写

XIAOYOUDUODUO的博客 6055

synchronized原理,偏向锁、轻量级锁、重量级锁

重量级锁是依赖对象内部的monitor锁来实现的,而monitor又依赖操作系统的MutexLock(互斥锁)来实现的,所以重量级锁也被称为互斥锁。偏向锁状态:Mark Word记录: 线程ID、Epoch(偏向锁的时间戳)、GC分代年龄、是否偏向锁、锁标志位。无锁状态:Mark Word记录: 对象的哈希码(HashCode)、GC分代年龄、是否偏向锁、锁标志位。重量级锁状态:Mark Word记录:指向互斥锁(重量级锁)的指针、锁标志位。java对象:对象头、实例数据、对齐填充。

忆亦何为的博客 661

【亲测好用】解决Windows系统Vscode终端无法使用yarn报错无法加载文件

我明明使用`npm i -g yarn ` 安装成功了 甚至在文件夹处 CMD 也可以看到yarn 的版本 甚至在Vscode中又重新安装了一遍yarn 为什么还是报错呢?

Aeporn的博客 888

Zynq7000混合启动方案:QSPI Flash引导与eMMC ext4文件系统部署实战

本文详细介绍了Zynq7000平台的混合启动方案,结合QSPI Flash引导与eMMC ext4文件系统部署,解决嵌入式Linux系统启动可靠性与大容量存储需求。通过硬件连接配置、分区规划、Petalinux工程配置及实战部署步骤,帮助开发者高效实现系统优化,提升启动速度和文件系统性能。

weixin_29190169的博客 448

synchronized 底层实现原理、重量级锁、轻量锁、锁膨胀、锁自旋、偏向锁详解

在JVM中,对象拥有一个“对象头”,格式如下,其中包括了标记字(Mark Word)和类型指针(Class Pointer),Klass Word指向的是该对象所属的类,而Mark Word中记录了对象的一些状态信息,包括对象的哈希码、锁状态和GC相关信息等。在上文中可知,轻量级锁在没有竞争时(还是这个线程来获取锁),将会发生锁重入,要执行CAS操作,并在栈桢创建新的锁记录。当有线程(称为Thread-2)运行如下程序时,即在给对象obj上锁,此时,该对象头的Mark Word,若还有别的线程,则同上。

qurious7的博客 1989

【人工智能之深度学习】23. 推荐系统升级实战:LightGCN重构协同过滤全流程(Amazon-Beauty数据集+完整代码)

摘要:传统协同过滤(如矩阵分解)在电商推荐中存在三大痛点:忽略用户-物品高阶关联、交互数据稀疏导致冷启动、特征工程依赖人工设计。本文基于Amazon-Beauty数据集(含20万+用户交互),用LightGCN图神经网络重构推荐系统:1)构建用户-物品二部图,通过3层图卷积捕捉“用户→物品→用户”的多跳关联;2)采用BPR负采样损失优化嵌入学习,缓解数据稀疏;3)端到端输出用户/物品嵌入,无需人工特征。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1494

Java锁synchronized关键字学习系列之轻量级锁

文章目录Java锁synchronized关键字学习系列之轻量级锁轻量级锁加锁原理轻量级锁释放锁原理轻量级锁重入总结参考 Java锁synchronized关键字学习系列之轻量级锁 轻量级锁加锁原理 在代码访问同步资源时,如果锁对象处于无锁不可偏向状态,JVM首先将在当前线程的栈帧中创建一条锁记录(lock record),用于存放: displaced mark word:存放锁对象当前的mark word的拷贝(为了解锁的时候恢复给锁对象,后面会说) owner指针:指向当前的锁对象的指针,在拷贝

C. 1376

PCL 平面点云的凹多边形边界提取【2025最新版】

平面点云的凹多边形边界提取及边界轮廓线绘制。博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 7185

新手秒变高手:使用一键脚本快速安装OpenClaw并完成初始化配置

一键脚本是一种自动化工具,可以帮助用户快速完成软件的安装和配置过程,无需手动执行繁琐的命令。OpenClaw提供了官方的一键安装脚本,让新手用户也能轻松部署OpenClaw。

一键难忘的博客 359

轻量锁偏向锁重量锁害人不浅!synchronized源码!

从源码分析synchronized实现

qq_35040959的博客 504

R语言层次聚类(hierarchical clustering):数据缩放、PCA聚类结果可视化、fpc包的clusterboot函数通过bootstrap重采样的方法评估hclust层次聚类的稳定性

R语言层次聚类(hierarchical clustering):数据缩放、PCA聚类结果可视化、fpc包的clusterboot函数通过bootstrap重采样的方法评估hclust层次聚类的稳定性

data+scenario+science+insight 836

synchronized原理、偏向锁、轻量级锁、重量级锁、锁升级

偏向锁是一种加锁操作的优化机制。经过研究发现大部分情况下是不存在锁竞争,一直都是一个线程去获取锁,因此为了消除在无竞争情况下重入锁(CAS操作)的开销,而引入了偏向锁。对于没有竞争的场合,偏向锁有很好的优化效果。JVM1.6默认开启偏向锁。新创建一个对象,此时给对象的Mark Word中的ThreadID为0,说明该对象处于可偏向但未偏向任何线程,也叫作匿名偏向状态。

qq_44027353的博客 1524

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

synchronized底层原理、偏向锁、轻量级锁、自旋锁详解

文章目录1.Java对象头2.Monitor工作原理3.synchronized原理4.synchronized原理进阶5.轻量级锁6.锁膨胀7.自旋优化8.偏向锁 1.Java对象头 对象头包含两部分:运行时元数据(Mark Word)和类型指针 (Klass Word) Mark Word Mark Word用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致。 类型指针 类型指针指向对象的类元数据

张大安的博客 2802

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

synchronized底层原理(重量级锁,轻量级锁,偏向锁)

synchronized底层原理(重量级锁,轻量级锁,偏向锁)

trigger的博客 2629

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

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

Synchronized原理--偏向锁、轻量级锁、重量级锁的理解

偏向锁,轻量级锁的应用场景

qq_30507459的博客 830

java 偏向锁、轻量级锁及重量级锁synchronized原理(转载)

java 偏向锁、轻量级锁及重量级锁synchronized原理   Java对象头与Monitor java对象头是实现synchronized的锁对象的基础,synchronized使用的锁对象是存储在Java对象头里的。 对象头包含两部分:Mark Word 和 Class Metadata Address     其中Mark Word在默认情况下存储着对象的HashCode、分代年龄、锁标记位等以下是32位JVM的Mark W...

傲慢的沙扬娜拉 268

synchronized原理,以及轻量级锁,线程锁记录存的是什么

对象头的 Mark Word 是一个 32 位(32-bit JVM)或 64 位(64-bit JVM)的字段,其内容在不同状态下会有所不同。的底层是通过 JVM 和操作系统的协作实现的。通过锁记录和对象头的 Mark Word,JVM 实现了轻量级锁的高效锁管理机制。这个副本存储了锁的当前状态信息,用于线程对锁的操作管理。轻量级锁,线程的锁记录(lock record)存的是什么?的加锁、竞争锁以及释放锁的底层实现详解。的释放锁是通过 JVM 的。的加锁是通过 JVM 的。

2301_79652490的博客 878

Java并发02---Synchronized的实现原理、锁的升级、锁的膨胀、对象头、锁的消除、偏向锁、轻量级锁、轻量级锁

Synchronized的实现原理、锁的升级、锁的膨胀、对象头、锁的消除、偏向锁、轻量级锁、轻量级锁

Aa102365478的博客 1259

synchronized原理分析及轻量级锁、锁膨胀、自旋优化、偏向锁、锁消除

synchronized Java HotSpot 虚拟机中,每个对象都有对象头(包括 class 指针和 Mark Word)。Mark Word 平时存储这个对象的 哈希码、分代年龄,当加锁时,这些信息就根据情况被替换为 标记位、线程锁记录指针、重量级锁指针、线程ID 等内容 Java 对象头 以 32 位虚拟机为例 普通对象 数组对象 其中 Mark Word 结构为 64 位虚拟机 Mark Word Monitor 原理 Monitor 被翻译为监视器或管程 每个 Jav

liuhehe的博客 330

Synchronized原理(轻量级锁篇)

Synchronized原理(轻量级锁篇) 简述 介绍 轻量级锁是JDK1.6之中加入的新型锁机制,它名字中的“轻量级”是相对于使用操作系统互斥量来实现的传统锁而言的,因此传统的锁机制就称为“重量级”锁。首先需要强调一点的是,轻量级锁并不是用来代替重量级锁的,它的本意是在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗。 轻量级锁能够提升程序性能的依据是“对绝大部分的锁,在整个同步周期内都不存在竞争”,注意这是经验数据。需要了解的是,轻量级锁所适应的场景是线程交替执行同步块的场合,

qicha3705的博客 1万+

synchronized优化原理--重量级锁、轻量级锁、偏向锁

synchronized原理及重量级锁 采用【互斥】的方式让同一时刻至多只有一个线程能够持有对象锁,其他线程想获取这个对象锁就会阻塞住,从而保证拥有锁的线程可以安全的执行临界区内的代码,不用担心线程上下文切换 语法: synchronized(锁对象) { 临界区代码 } synchronized放在成员方法上,等价于锁住this对象; synchronized放在静态方法上,等价于锁住类; 1、对象头: 对象头包括:Mark Word 和 Klass Word。 Kclass Word 32位:指向

weixin_42048754的博客 258

Java 中 synchronized 的实现原理及偏向锁、轻量级锁、自旋锁、公平锁简介

    在多线程编程中,synchronized 一直都是元老级别的存在,很多人都称之为重量级锁。本文来简单介绍synchronized的实现原理,以及为减少获得锁和释放锁所带来的性能损耗而引进的偏向锁与轻量级锁。     Java中使用synchronized来实现同步的基础是什么呢?Java中每一个对象都可以作为锁!         对于普通同步方法,锁是当前实例对象。         ...

Zhang_hongxin的博客 978

【JUC】并发编程 Synchronized 锁升级原理(偏向锁,轻量级锁,重量级锁)

monitorenter: 将锁对象对象头中Mark Word的前30bit替换成指向操作系统中与其关联的monitor对象,将锁记录位状态改为10monitorexit: 将锁对象对象头中Mark Word进行重置,重新恢复成原来的样子,并通过在EntryList中等待的线程来继续竞争!工作流程:开始时 Monitor 中 Owner 为 null。

奶酪的博客 1045
上一篇: 手画图解,关于死锁,面试的一切都在这里了
下一篇: 【JVM深层系列】JVM调优的“标准参数“的各种陷阱和坑点分析
Java佳佳
博客等级 码龄4年 216粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值