java里面Synchronized关键字的底层原理

全网最详细 解决戴维南定理的详细推导 替代定理,戴维南定理详细证明 阅读详情

###  Monitor对象

Monitor 对于每一个java对象都关联一个Monitor对象,如果使用synchronized关键,给对象上锁(重量级锁)之后,该对象的Mark word中就会设置指向Monitor对象的指针。下图是32位jvm的mark word 组成:

上图是Monitor的结构:

刚开始Monitor对象中的owner为null, 当线程Thread-2执行synchronized(obj)的时候,就会将monitor的owner置为Thread-2, 而且Monitor对象的owner只能有一个,所以当其他线程,在执行synchornized(obj)时,Thread-3,Thread-4,Thread-4 就会就如EntryList的队列里面。

当Thread-2的代码执行完毕,释放锁对象,同时唤醒EntryList中的Thread来竞争锁,而且是非公平的竞争。

### 轻量级锁:

    所谓轻量级锁,就是多个线程在访问同一个锁对象的时候 是时间错开的,没有竞争的状态。还是使用synchronized

 static  Object object = new Object();
    public static void method1() {
        synchronized (object) {
            //同步块A
            method2();
        }
    }

    private static void method2() {
        synchronized (object) {
            //同步块B
        }
    }

当Thread-1在执行上面的代码的时候,会在线程栈中的method1栈帧中创建Lock Record(锁记录对象) ,并且让Lock Record的Object Reference执行Object锁对象,并尝试用CAS替换Object的mark word, 将mark word的值放到Lock Record里面。如下图所示:

如果CAS失败,就会有下面两种情况:

  1. 如果其他线程已经持有了Object对象的轻量级锁,那么对于当前线程来说,就是有竞争则要进入到锁膨胀过程。

   2. 如果是当前自己的线程,则要执行synchronized锁重入,那么需要在当前线程的栈中在添加一条Lock Record记录。将Lock Record 中的Object Reference指向锁对象,话有Lock Reference第一个位置置为null. 过程如下图:

   

### 解锁的过程

  在退出synchronized代码块(解锁)的时候,先判断Lock Record 里面的数据有为null,表示有重入,这是重置锁的记录,也就是把栈里面的Lock Record为null 的数据删除,直到剩下不为null的Lock Record的记录。开始还原object的Mark word操作。

利用CAS将Lock record 里面的数据(之前交换的数据)还原到Object里面的mark word中,结果成功则完成解锁,失败表示已经进入了锁膨胀,需要重量级锁的解锁过程。

 

 

 

蠕虫病毒代码(纯属参考,请勿用于非法事件) 1.介绍蠕虫病毒 蠕虫病毒是一种常见的计算机病毒,是无须计算机使用者干预即可运行的独立程序,它通过不停的获得网络中存在漏洞的计算机上的部分或全部控制权来进行传播。 计算机病毒是指编制或者在计算机程序中插入的破坏计算机功能或者破坏数据和恶意篡改系统. 影响计算机使用并且能够自我复制的一组计算机指令或者程序代码 中文名:蠕虫病毒 传染方式:网络和电子邮件 外文名:Worm virus 类型:计算机病毒 2.代码(建议使用虚拟机,否则你的计算机将会就地报废,使用时要关闭电脑病毒保护,否则程序会... 阅读详情

相关推荐

Virtuoso ADE Explorer实战技巧:从基础操作到高级仿真

本文深入解析了Virtuoso ADE Explorer在模拟电路仿真中的核心价值与实战技巧。作为Cadence平台的专业工具,它专为高效、系统化的设计空间探索而生,能大幅提升PVT验证、参数扫描和蒙特卡洛分析的效率。文章从基础界面操作、并行仿真管理,到高级的参数扫描、数据报告生成及蒙特卡洛结果深度剖析,提供了全面的避坑指南与工作流优化建议,帮助工程师从重复劳动中解放,专注于电路设计与性能优化。

ios99的博客 899

synchronized 的底层原理

synchronized 的底层原理

激流丶的博客 7442

软考软件评测师备考避坑指南:过来人告诉你这5个章节最容易丢分(附2024最新考纲解析)

本文为软考软件评测师考生提供备考避坑指南,深度解析5个高频失分章节,包括标准化与信息化基础、中间件技术、软件测试模型、白盒测试覆盖准则和性能测试指标。文章结合2024最新考纲,分享实战技巧和记忆口诀,帮助考生精准打击失分重灾区,提升备考效率。

weixin_29223603的博客 467

Synchronized的底层实现原理(原理解析,面试必备)

synchronize的底层实现原理和monitor的实现机制

weixin_42460087的博客 3万+

QGIS|如何将WGS84转换为CGCS 2000坐标系?

QGIS 3中如何将WGS84转换为国家2000大地坐标系? 今天来回答一位朋友在后台留言提出的问题:怎么将WGS84坐标转换为国家2000大地坐标系。 01工程坐标系 从地图窗口右下角的状态栏可以看到当前地图窗口的坐标系,即工程坐标系(Project CRS)。当前地图可以由多个图层组成,各种来源数据的坐标参照系(Layer CRS)并不一定相同,QGIS在绘制图层之前将根据工程坐标系进行动态坐标转换,然后显示在地图画布中。 因此,在处理空间数据的过程中,一定要特别注意...

QGISClass的博客 1万+

Type-C快充移动电源芯片避坑指南:IP5356配置全流程(支持PD3.0)

本文详细解析了英集芯IP5356芯片在Type-C快充移动电源中的应用,提供了从芯片选型、原理图设计、PCB布局到PD协议调试的全流程实战指南。文章重点剖析了如何避免散热、EMI及协议握手等常见设计陷阱,并分享了量产前的关键测试验证方法,旨在帮助硬件开发者高效打造稳定可靠的快充产品。

weixin_29235525的博客 849

Synchronized底层原理深入解析

synchronized是Java中的一个关键字,用于保证多线程访问共享资源时的互斥性。它可以用在方法或代码块上,用于加锁某个对象或者类,避免多个线程同时访问临界区代码,造成数据不一致或线程安全问题。为了减少锁竞争带来的性能瓶颈,Java提供了一些优化技术和策略来减少锁的粒度、提升锁的效率,从而提高多线程程序的性能。常见的优化策略有减少锁的粒度锁粗化和锁消除。特性主要功能显式锁,提供更多控制,如尝试锁、定时锁、可中断锁等用于线程等待某些任务完成后继续执行互斥控制,确保对共享资源的访问线程协调。

一碗黄焖鸡三碗米饭的博客 1554

UE5高斯泼溅落地全链路:从PLY导入到实时渲染的工程实践

3D高斯泼溅(3D Gaussian Splatting)正从NeRF后处理技术演进为新一代隐式几何渲染范式,其核心在于以可微椭球体替代传统三角面片,通过协方差矩阵与球谐系数实现高质量体素化渲染。该技术突破点云精度瓶颈,但与UE5现有资产管线存在根本性不兼容——静态网格导入器无法解析scale/rot/sh系数等非标顶点语义,标准光栅化管线亦无法执行高斯核采样计算。XV3DGS-UEPlugin通过自定义资产类型、StructuredBuffer GPU数据流与专用材质节点,将高斯泼溅重构为可编辑、可LOD

weixin_33692177的博客 357

一文带你理解synchronized底层原理

如果某一个资源被多个线程共享,为了避免因为资源抢占导致资源数据错乱,我们需要对线程进行同步,那么就是实现线程同步的关键字,可以说在并发控制中是必不可少的部分,今天就来看一下synchronized的使用和底层原理。

H931053的博客 893

霜冰优化算法(RIME)详解:从自然现象到智能优化

霜冰优化算法(RIME)是一种新型元启发式优化算法,灵感源于自然界中霜冰的形成过程。该算法通过模拟软霜和硬霜的不同生长特性,实现了高效的全局探索和局部开发平衡。RIME算法包含三个核心机制:软霜搜索策略模拟随机覆盖特性实现全局探索;硬霜穿刺机制模拟定向生长特性进行局部开发;正向贪婪选择机制确保解的持续优化。与遗传算法、粒子群算法相比,RIME具有参数少、收敛快、自适应平衡等优势,特别适合处理高维复杂优化问题。算法已在工程优化、机器学习等领域获得广泛应用,发表一年内即成为高被引论文。

qq_42212808的博客 783

从数据到行为的可控暴露:SAP RAP 中的 BO Projection 与 BO Interface 全面实践指南

本文系统梳理了ABAP RAP中BO Projection与BO Interface的定位与实现方式。BO Projection面向业务服务(如UI/API),通过CDS投影视图(as projection on)和行为定义裁剪字段与操作,实现差异化暴露;BO Interface则为EML代码和跨组件复用提供稳定访问层,使用transactional_interface标识。两者均遵循C_/I_命名规范,通过分层设计实现封装性、安全性和灵活性。文中结合真实案例展示了如何通过不同投影满足多角色需求,并详细说明

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 249

Synchronized 底层实现原理

Synchronized 底层实现原理

快乐的小三菊的博客 810

AF自动对焦 CDAF PDAF

前言 主流的AF: CDAF, PDAF, laser assist AF(这个只是辅助,在微距或者拍摄纹理不明显的场景下好用)。 1.cdaf原理 CDAF的大致原理就是检测图像锐度或者等价于锐度的参数,不断推动马达寻找最清晰点实现合焦或者对焦。如下图: 缺点:对焦准确,速度慢,由于camera帧率,cpu处理速度,马达反映时间问题不能实时对焦运动物体。 2.pdaf原理 计算相位差,将相位差转换为相位差和af code的关系....

camerall 1万+

java 关键字 synchronized 的底层实现原理

特性描述关键字锁类型互斥锁(悲观锁)实现基础Java 对象头 + Monitor锁升级机制无锁 → 偏向锁 → 轻量级锁 → 重量级锁字节码支持优点使用简单,语义清晰,无需手动释放锁缺点性能较低(尤其在高竞争场景下),可扩展性差适用场景简单同步控制、兼容旧代码、对性能要求不极端的场景。

Java的专栏 1333

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

synchronized关键字底层原理 Java

synchronized用法在我的另外一篇博客中有讲链接如下,这篇博客主要讲底层原理。 synchronized用法 预备知识 理解Java对象头与Monitor 在JVM中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。 实例变量:存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。 填充数据:由于虚拟机要求对象起始地址必须...

qq_42411214的博客 244

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java关键字底层原理,讲一下 synchronized 关键字的底层原理

synchronized 关键字底层原理属于 JVM 层面。① synchronized 同步语句块的情况public class SynchronizedDemo {public void method() {synchronized (this) {System.out.println("synchronized 代码块");}}}通过 JDK 自带的 javap 命令查看 Synchron...

weixin_32151313的博客 153

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java synchronized关键字用法和底层原理

摘要: synchronized是Java实现线程同步的关键字,通过监视器锁机制确保共享资源安全访问。它支持三种用法:同步实例方法(锁this)、同步静态方法(锁Class对象)和同步代码块(自定义锁对象)。配合wait()/notify()可实现线程协作,需注意必须在同步块内调用,并用循环防止虚假唤醒。底层通过对象头的Mark Word实现锁升级(无锁→偏向锁→轻量级锁→重量级锁),平衡性能与线程安全。关键点包括可重入性、锁范围最小化及与Lock的区别,重量级锁涉及系统调用开销较大。

zfj321的博客 1263

Java多线程之synchronized、volatile关键字底层原理

文章目录接上一篇用户态与内核态CASUnsafemarkword工具:JOL = Java Object Layoutsynchronized的横切面详解java源码层级字节码层级JVM层级(Hotspot)锁升级过程JDK8 markword实现表:锁重入synchronized最底层实现synchronized vs Lock (CAS)锁消除 lock eliminate锁粗化 lock c...

Fstrovsky的博客 1203

Java synchronized关键字的底层实现以及锁升级优化的原理【一万字】

介绍了synchronized关键字实现锁的底层原理以及JDK对于synchronized做出的锁升级优化!

终生学习践行者 4845

java 底层面试_讲一下 synchronized 关键字的底层原理 ?

synchronized 关键字底层原理属于 JVM 层面。**① synchronized 同步语句块的情况public class SynchronizedDemo {public void method() {synchronized (this) {System.out.println("synchronized 代码块");}}}通过 JDK 自带的 javap 命令查看 Synchro...

weixin_42510768的博客 269

深入解析Java中synchronized关键字的底层原理

关键字作为Java并发编程的基础,其底层实现原理涉及对象监视器、锁的获取与释放以及锁的升级与降级等多个方面。通过理解这些原理,我们可以更好地使用来解决多线程环境下的同步问题,同时也可以根据实际需求选择合适的同步机制。在实际开发中,应根据具体场景和性能需求来选择使用还是等更高级的同步工具。

574

Java多线程—Synchronized关键字底层原理

在说synchronized的相关底层实现我们就简单聊一聊synchronized的用法,其实最常用的就两种方式,直接去修饰一个方法,我们把这个方法叫做同步方法,或者用大括号去修饰一个代码块,当然代码块里的内容就叫做同步代码块 public synchronized void fun(){ //同步方法 //to do } public void...

weixin_42178281的博客 1519

《Java并发编程》- synchronized关键字底层实现原理分析

阐述synchronized关键字底层实现原理,以及synchronized核心优化的场景分析,包含了批量重偏向/批量撤销,自旋优化,锁消除/锁粗化等场景

weixin_38277138的博客 242

简述Java中synchronized关键字的底层工作原理

的底层实现复杂且高效,通过锁的不同状态和锁升级机制,JVM可以在运行时根据具体情况调整同步策略,从而提供良好的性能和线程安全保障。

www_tlj的专栏 538

【Java并发】synchronized关键字的底层原理

Java中的synchronized有偏向锁轻量级锁重量级锁三种形式,分别对应了锁只被一个线程持有不同线程交替持有锁多线程竞争锁三种情况。锁对应情况偏向锁只被一个线程持有轻量级锁不同线程交替持有锁重量级锁多线程竞争锁锁描述重量级锁底层使用的Monitor实现,里面涉及到了用户态和内核态的切换、进程的上下文切换,成本较高,性能比较低。轻量级锁线程加锁的时间是错开的(也就是没有竞争),可以使用轻量级锁来优化。轻量级修改了对象头的锁标志,相对重量级锁性能提升很多。

weixin_45618869的博客 266

【Java】Java中synchronized关键字的底层原理

如果来了一个线程,是否为null,如果为null,则让当前线程持有,如果不为null,则该线程去EntryList中去等待(阻塞),如果持有锁的线程调用了wait方法,则会进入WaitSet。

L1951381654的博客 365
上一篇: 在window环境下面virtualbox加载移动硬盘里创建好的虚拟机
下一篇: mysql中查询遇到longtext类型,查询效率很低。
Bonyin
博客等级 码龄10年 166粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值