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

【java八股文】深入浅出synchronized优化原理

在这里插入图片描述

🔍 开发者资源导航 🔍
🏷️ 博客主页: 个人主页
📚 专栏订阅: JavaEE全栈专栏

synchronized优化原理

synchronized即使悲观锁也是乐观锁,拥有自适应性。 jvm内部会统计每个锁的竞争激烈程度,自动识别。

它在运行时主要有三种优化策略。

锁升级

路径

无锁->偏向锁->自旋锁->重量级锁

如果对于这些概念不清楚可以参考这篇文章->点我

无锁->偏向锁
所谓偏向锁就是进行一个简单的标记,并不是真正的加锁,这个标记非常的轻量,相对于加锁高效的多。

如果到最后没人和它竞争这个锁,那么到最后只需要清除简单的标记。

偏向锁->自旋锁

在偏向锁的情况下遇到了锁竞争,那么他会在其他线程加锁之前对它先进行加自旋锁的操作。

自旋锁->重量级锁

如果这个锁的竞争情况非常激烈,就会对这个锁升级到重量级锁。

在jvm只提供了锁升级,并没有涉及锁降级操作。

锁消除:

编译器优化的一种体现

编译器会判定,当前的这个代码逻辑是否真的需要加锁,如果确实不需要加锁,但是你写了synchronized,就会自动去掉。

这个判定比较保守,只有100%确认这个代码是单线程的时候才会触发,当判断不清楚的时候不会触发,因此不会出现判断逻辑错误导致的线程安全。

锁粗化:

锁的粒度:加锁和解锁之间,包含的代码越多,就认为锁的粒度越粗,如果越少,就认为越细。这里代码指的是实际执行的指令/时间。

如果检测到一连串连续的对同一个对象的加锁和解锁操作(即使没有竞争),JVM 可能会将这些操作合并为一个更大范围的加锁,减少锁的获取和释放次数,从而提高性能。

优化前(细粒度锁,效率低)

synchronized (obj) {// 操作1
}
synchronized (obj) {// 操作2
}
synchronized (obj) {// 操作3
}

优化后(锁粗化,合并为一个锁)

synchronized (obj) {  // JVM 可能会合并成一个锁// 操作1// 操作2// 操作3
}

感谢各位的观看Thanks♪(・ω・)ノ,如果觉得满意的话留个关注再走吧。

http://www.xdnf.cn/news/3785.html

相关文章:

  • 嵌入式Linux应用项目----智能网关
  • Docker Compose:服务编排:批量管理多个容器
  • 《Java高级编程:从原理到实战 - 进阶知识篇四》
  • 利用Elixir中的原子特性 + 错误消息泄露 -- Atom Bomb
  • 深度思考Qwen3
  • MySQL 中日期相减的完整指南
  • # 基于词袋模型(BoW)的猫狗图像分类实践
  • vue的diff算法是什么、比较方式,原理分析、示例解释讲解
  • 迭代器的思想和实现细节
  • 【序列化与反序列化详解】
  • 【漫话机器学习系列】237. TSS总平方和
  • 【2025软考高级架构师】——未来信息综合技术(11)
  • C++笔记-多态(包含虚函数,纯虚函数和虚函数表等)
  • 在MySQL中建索引时需要注意哪些事项?
  • Vue3源码学习5-不使用 `const enum` 的原因
  • 普推知产:图形商标通过初审,图形商标申请时注意!
  • 【深度学习】典型的 CNN 网络
  • Linux第20节 --- inode和文件系统
  • qsort函数的用法
  • MySQL 日期加减函数详解
  • 61常用控件_QDateTimeEdit的使用
  • 用Maven定位和解决依赖冲突
  • 研究主题:聊天机器人使用与情感纽带的形成
  • 归并排序【逆序对】
  • 【AI面试准备】数据驱动测试思维与实践指南
  • 使用Node.js搭建https服务器
  • 《Windows 环境下 Qt C++ 项目升级 GCC 版本的完整指南》
  • 如何在WORD WPS中输入英语音标 批量给英语标注音标
  • 【堆】最大堆、最小堆以及GO语言的实现
  • Redis从入门到实战实战篇2