当前位置: 首页 > news >正文

JVM中的锁优化

锁优化

Jvm 在加锁的过程中,会采用自旋、自适应、锁消除、锁粗化等优化手段来提升代码执行效率。

  • 什么是锁升级,降级?

锁的4中状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态(级别从低到高)。
所谓的锁升级、降级,就是 JVM 优化 synchronized 运行的机制,当 JVM 监测到不同的竞争状况是,会自动切换到不同的锁实现。这种切换就是锁的升级、降级。

锁升级

偏向锁

因为经过大量的研究发现,大多数时候是不存在锁竞争的,常常是一个线程多次获得同一个锁,因此如果每次都要竞争锁会增大很多没有必要付出的代价,为了降低获取锁的代价,才引入的偏向锁。

在程序的一开始,处于无锁状态。紧接着,有一个线程申请锁,此时通过CAS竞争锁(CAS保证了此竞争行为的原子性),获取锁成功,Mark Word 将标记为偏向锁。当同样的线程再次到来,发现是锁的持有者并且是偏向锁,直接进入临界区。
因此,偏向锁意味着,不会发生竞争条件,因为只有一个线程。

轻量级锁

随着程序的运行,有新的线程要进入临界区,通过CAS竞争锁失败。Mark Word立即将偏向锁标记锁为轻量级锁,因为已经发生了竞争条件。紧接着,会反复同通过CAS为线程获取锁,如果占有锁的线程在临界区待的时间很短,那么申请锁的线程将很快拿到锁。
因此,轻量级锁意味着,有竞争条件,但是大家能很快地被分配到锁。

重量级锁

当然,申请锁的线程并不总是能很快地获取到锁,与其反复地CAS重试而浪费CPU时间,不如直接将线程阻塞住。那么,在轻量级锁的情况下,如果有线程超过一定次数的重试还是获取不到锁,Mark Word立即将轻量级锁标记为重量级锁,此后所有获取不到锁的线程将被阻塞,需要Monitor的参与。

因此,重量级锁意味着,在有竞争条件的情况下,线程不能很快地被分配到锁。

Synchronized的锁只能膨胀,不能收缩。偏向锁和轻量锁为乐观锁,重量级锁为悲观锁。

Synchronized的好处在于,它的优化、锁申请释放、锁的分配都是自动的,开发者能快速地使用。

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

线程1获取轻量级锁时会先把锁对象的对象头MarkWord复制一份到线程1的栈帧中创建的用于存储锁记录的空间(称为DisplacedMarkWord),然后使用CAS把对象头中的内容替换为线程1存储的锁记录(DisplacedMarkWord)的地址;

如果在线程1复制对象头的同时(在线程1CAS之前),线程2也准备获取锁,复制了对象头到线程2的锁记录空间中,但是在线程2CAS的时候,发现线程1已经把对象头换了,线程2的CAS失败,那么线程2就尝试使用自旋锁来等待线程1释放锁。

但是如果自旋的时间太长也不行,因为自旋是要消耗CPU的,因此自旋的次数是有限制的,比如10次或者100次,如果自旋次数到了线程1还没有释放锁,或者线程1还在执行,线程2还在自旋等待,这时又有一个线程3过来竞争这个锁对象,那么这个时候轻量级锁就会膨胀为重量级锁。重量级锁把除了拥有锁的线程都阻塞,防止CPU空转。

锁膨胀

当轻量级锁失败,虚拟机就会使用重量级锁。使用重量级锁时,对象的Mark Word中的末尾的2位会被设置为'10'。整个Mark Word表示指向monitor对象的指针。

JVM对锁的优化
1.自旋锁

在没有加入锁优化时,Synchronized是一个非常“胖大”的家伙。在多线程竞争锁时,当一个线程获取锁时,它会阻塞所有正在竞争的线程,这样对性能带来了极大的影响。在挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作对系统的并发性能带来了很大的压力。同时HotSpot团队注意到在很多情况下,共享数据的锁定状态只会持续很短的一段时间,为了这段时间去挂起和回复阻塞线程并不值得。在如今多处理器环境下,完全可以让另一个没有获取到锁的线程在门外等待一会(自旋),但不放弃CPU的执行时间。等待持有锁的线程是否很快就会释放锁。为了让线程等待,我们只需要让线程执行一个忙循环(自旋),这便是自旋锁由来的原因。

2.锁粗化

如果一系列的连续操作都是对同一个对象反复加锁和解锁,甚至加锁操作是出现在循环体中的,那即使没有线程竞争,频繁地进行互斥同步操作也会导致不必要的性能损耗。在这种情况下,虚拟机便会把所有的锁操作优化成对锁的一次请求,从而减少对锁的请求同步次数,这个操作叫做锁粗化。

3.锁消除

锁消除是指JIT编译器在运行时,将一些在代码上同步了但实际上不可能存在共享数据竞争的锁进行消除。

锁消除主要是根据逃逸分析技术来判定的,如果判断在一段代码中,堆上的所有数据都不会逃逸出去从而被其它线程访问到,那就可以把它们当做栈上数据对待,认为它们是线程私有的,同步加锁自然就无需进行了。

AI大模型学习福利

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

http://www.jsqmd.com/news/268392/

相关文章:

  • 450万天价零日突袭:通杀Android12-16的静默攻击,数十亿设备安全重构迫在眉睫
  • 【计算机毕业设计案例】基于SpringBoot+微信小程序的微信电影院票务系统管理系统(程序+文档+讲解+定制)
  • Github千星项目之.Net(四)
  • Python编程最好的就业方向是什么?
  • APP/小程序个人信息保护合规自查手册(附整改方案)
  • Linux文件权限777和755的区别!
  • 文件脱敏程序设计思路
  • 电路架构的三维呈现:利用芯片3D动画解锁IC设计的视觉奥义
  • 亲测Meta-Llama-3-8B-Instruct:8K上下文对话效果超出预期
  • 小程序计算机毕设之基于springboot+微信小程序的电影院票务、在线购票话剧票务管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 误差反向传播法(链式法则)
  • 2026企业认证体系迎大洗牌:Net-NTLMv1彩虹表数据库 敲响NTLMv1丧钟
  • 李飞飞的World Labs联手光轮智能,具身智能进入评测驱动时代!
  • 反向传播为何如此高效?解锁其核心引擎:链式法则
  • 【tensorRT从零起步高性能部署】22-TensorRT基础-模型推理动态shape
  • 内网凭据挖掘技术深度揭秘:从终端渗透到网络服务的企业防线突破全链路解析
  • 这家西方开源大模型公司,开源出了DeepSeek-V3背后的架构!头部模型表现都差不多了,Mistral CEO自曝如何赚钱
  • 2026开年炸雷!Apache Kafka三重高危漏洞肆虐:RCE+DoS+SSRF齐发,波及2.0.0-3.9.0全版本,企业升级刻不容缓
  • 方程豹豹8开启智驾撞牛未停车 车主质疑:智驾有什么用呢?
  • 【普中STM32F1xx开发攻略--标准库版】-- 第 29 章 内部温度传感器实验
  • 手搓HTML解析器:500行代码实现完整的DOM树构建
  • 三招速查本机端口占用
  • 护照阅读器:爱达魔都号邮轮的高效登船助力
  • 【读书笔记】《日常生活中的自我呈现》
  • 小程序毕设项目推荐-基于微信小程序的文化娱乐购票系统基于springboot+微信小程序的话剧票务管理系统【附源码+文档,调试定制服务】
  • 马斯克狂砸16亿「买」他五年!揭秘特斯拉2号人物,那个睡工厂的狠人
  • 双目摄像头:让人脸登录更安全可靠
  • 【读书笔记】《傅雷家书》
  • R8240数字电子计
  • 纽约时报:OpenAI或将在18个月内现金流枯竭