锁的优化过程

简介: 锁的优化过程

JVM 将 synchronized 锁分为 无锁、偏向锁、轻量级锁、重量级锁状态。会根据情况, 依次进行升级

🔎无锁

线程之间不会引发安全问题,就不用加锁


🔎偏向锁

偏向锁不是真的 “加锁”, 只是先让线程针对锁做个标记(这个过程很快)

如果代码执行过程中没有其他线程来竞争这个锁, 那么就不用加锁

如果有其他线程竞争这个锁, 那么偏向锁就会真的加锁, 变成轻量级锁

偏向锁是synchronized内部做的工作

synchronized 会针对某个对象进行加锁, 偏向锁就是先去对加锁的对象做个标记

当有其他线程竞争这个锁时, JVM就会通知 偏向锁 升级成 轻量级锁


🔎轻量级锁

轻量级锁基于自旋锁实现

自旋锁

优点: 能够第一时间拿到锁

缺点: 一直消耗CPU,做不了其他事情(忙等)

如果锁竞争过于激烈(CPU消耗过大)

那么 synchronized 就会从 轻量级锁 升级成 重量级锁


🔎重量级锁

重量级锁基于挂起等待锁实现

挂起等待锁

优点: 不再消耗大量CPU资源

缺点: 锁被释放后不能第一时间拿到锁

当 synchronized 升级成重量级锁, 就意味着线程要暂时放弃 CPU, 由内核进行后续调度


🔎其他的锁优化

🌸锁消除

锁消除是编译器做的优化手段

非必要不加锁,

编译器发现代码不会引起线程安全问题却加锁的时候, 就会把锁给取消掉

举个栗子🥝

StringBuffer 是内部方法里面加了锁🔒

但是上述代码并不会引起线程安全问题

所以编译器就会进行优化(锁消除)


🌸锁粗化

锁粒度

synchronized 代码块中包含代码的多少

包含的代码越多, 锁粒度就越粗

包含的代码越少, 锁粒度就越细

一般写代码时, 希望锁的粒度细(代码块中包含的代码少)

这样串行的时间就会少一些, 并发的时间就会多一些

如果某个场景中涉及到频繁的加锁, 解锁操作

编译器就会将其优化, 优化成一个更粗粒度的锁

这就是锁粗化

该场景中由于涉及到频繁的加锁, 解锁操作
于是编译器就将其优化成了一个更粗粒度的锁

一个更粗粒度的锁

举个栗子🥝

滑稽老哥去给领导汇报工作

滑稽老哥给领导打电话汇报A工作情况

汇报完毕,滑稽老哥挂断电话

滑稽老哥给领导打电话汇报B工作情况

汇报完毕,滑稽老哥挂断电话

滑稽老哥给领导打电话汇报C工作情况

汇报完毕,滑稽老哥挂断电话

滑稽老哥打电话汇报工作时, 此时如果有其他的电话打给领导, 只能阻塞等待

汇报完毕, 再次汇报时, 可能其他人也在给领导打电话, 滑稽老哥阻塞等待

滑稽老哥需要再次拨打电话汇报其他工作情况(重新竞争锁)

针对上述情况, 编译器将该操作优化成了一个更粗粒度的锁

滑稽老哥向领导依次汇报A, B, C工作情况, 而不是分别打电话进行汇报

(滑稽老哥打电话给领导, 汇报工作A, B, C的情况, 挂断电话)

🔎结尾

创作不易,如果对您有帮助,希望您能点个免费的赞👍

大家有什么不太理解的,可以私信或者评论区留言,一起加油

相关文章
|
开发工具 Android开发 数据安全/隐私保护
Cocos Creator Android 平台 Facebook 原生登录(一)
Cocos Creator Android 平台 Facebook 原生登录
749 0
|
7月前
|
传感器
基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真
本课题基于SVPWM矢量控制,构建无速度传感器电机控制系统Simulink模型,涵盖电机、SVPWM模块及矢量控制器。通过电流闭环反馈实现精确磁场定向和转矩控制,利用SVPWM生成高精度调制波形,适用于永磁同步电机(PMSM)。系统无需物理速度传感器,通过电压和电流反馈估计电机速度,广泛应用于电动车驱动、工业自动化等领域。模型版本:MATLAB2022a。
|
存储 安全 搜索推荐
https网站
https网站
1224 1
|
缓存 算法 Java
认真学习Java集合之LinkedHashMap的实现原理
认真学习Java集合之LinkedHashMap的实现原理
188 0
认真学习Java集合之LinkedHashMap的实现原理
|
存储 机器学习/深度学习 人工智能
通义语音AI技术问题之传统的VAD模型的局限性定义如何解决
通义语音AI技术问题之传统的VAD模型的局限性定义如何解决
232 0
|
自然语言处理 前端开发 JavaScript
魔改react-calendar还原UI设计中的打卡日历效果
魔改react-calendar还原UI设计中的打卡日历效果
121 0
|
负载均衡 监控 安全
SpringCloud框架的入门教程
Spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。
222 2
|
中间件 测试技术 调度
设计一个简易版本的分布式任务调度系统
设计一个简易版本的分布式任务调度系统
310 0
|
IDE 开发工具 Windows
手把手教你调整电脑磁盘的分区大小
手把手教你调整电脑磁盘的分区大小
1448 0
手把手教你调整电脑磁盘的分区大小
|
安全 网络安全
【网络安全/CTF】catcat-new
【网络安全/CTF】catcat-new
232 0