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

多线程—synchronized原理

上篇文章:

多线程—锁策略https://blog.csdn.net/sniper_fandc/article/details/146508232?fromshare=blogdetail&sharetype=blogdetail&sharerId=146508232&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

目录

1 synchronized的锁策略

2 synchronized的锁升级

3 synchronized的锁消除

4 synchronized的锁粗化


1 synchronized的锁策略

        1.synchronized即是乐观锁,也是悲观锁(自适应:根据锁竞争激烈程度升级)。

        2.synchronized即是轻量级锁,也是重量级锁(自适应:根据锁竞争激烈程度升级)。

        3.synchronized的轻量级锁是自旋锁(基于CAS)实现,重量级锁是挂起等待锁(操作系统的mutex锁实现)。

        4.synchronized是可重入锁。

        5.synchronized不是读写锁,是互斥锁。

        6.synchronized是非公平锁。

2 synchronized的锁升级

        1.synchronized一开始采用的是无锁状态,即此时没有任何线程加锁。

        2.当有线程尝试加锁时,此时synchronized升级为偏向锁,虽然名字叫锁,但此时没有加锁,只是往锁对象头加入了偏向锁标记,记录当前锁是哪个线程的,如果没有其他线程竞争锁,就不用真正的加锁,从而减少了加锁解锁的开销。如果此时有线程竞争锁,就取消偏向锁状态,进入真正的加锁状态。

        3.当偏向锁进入加锁状态时,也就是进入轻量级锁,基于CAS实现的自旋锁就是轻量级锁的实现,此时锁竞争还不激烈,加锁操作仅停留在用户态。(自旋锁不是一直占有CPU的,而是自旋了一定次数后就会停止尝试获取锁的行为)

        4.当锁竞争激烈时,此时自旋锁无法快速获得锁(就会一直浪费CPU资源),那就会升级为重量级锁。重量级锁是通过挂起等待锁实现的,也就是操作系统提供的mutex锁。当加锁时会进入内核态,判断是否能加锁,如果可以就加锁并切换回用户态;否则就把线程挂起等待操作系统的唤醒。

3 synchronized的锁消除

        JVM和编译器底层会判断当前场景是否是线程安全的,如果是线程安全的环境下用到synchronized,就会进行锁消除,不再加锁。比如StringBuffer类是线程安全的,因为其底层的方法中用到synchronized,如果在单线程环境下,就会进行锁消除。

4 synchronized的锁粗化

        锁分为细粒度(加锁范围小)和粗粒度(加锁范围大),当频繁使用细粒度锁加锁解锁时,JVM和编译器就会把多个细粒度锁优化成粗粒度锁,减少频繁的加锁解锁开销。

下篇文章:

多线程—JUC(java.util.concurrent)https://blog.csdn.net/sniper_fandc/article/details/146713322?fromshare=blogdetail&sharetype=blogdetail&sharerId=146713322&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

相关文章:

  • Ubuntu24.04 配置远程桌面服务
  • 当前环境下,数据安全何去何从?
  • [数据结构]并查集(系统整理版)
  • vscode 打开工程 看不到文件目录
  • FlexAlign.SpaceBetween`、`FlexAlign.SpaceAround` 和 `FlexAlign.SpaceEvenly三个属性的区别
  • 解决Dify:failed to init dify plugin db问题
  • C - 通讯录2.0(详细解析)
  • AI知识补全(八):多模态大模型是什么?
  • 第4期:重构软件测试体系——生成式AI如何让BUG无所遁形
  • Python包下载路径 Chrome用户数据 修改到非C盘
  • Elasticsearch 搜索高级
  • C#高级:启动、中止一个指定路径的exe程序
  • 六十天Linux从0到项目搭建(第十天)(系统调用 vs 库函数/进程管理的建模/为什么进程管理中需要PCB?/exec 函数/fork原理与行为详解)
  • 【Linux加餐-网络命令】
  • 数仓架构告别「补丁」时代!全新批流一体 Domino 架构终结“批流缝合”
  • vue中使用defineModel简化defineProps和defineEmits的用法
  • Node.js Express 处理静态资源
  • linux 抓图机器资源不足,排查和删除图片文件
  • Java | 基于 ThreadLocal 实现多客户端访问设备的 REST 请求下发
  • 量子计算:开启信息时代新纪元的钥匙
  • 学有质量、查有力度、改有成效,广大党员干部落实中央八项规定精神
  • 被算法重塑的世界,人与技术如何和谐共处
  • 西班牙葡萄牙电力基本恢复
  • 中国体育报关注徐梦桃、王曼昱、盛李豪等获评全国先进工作者:为建设体育强国再立新功
  • 美军空袭也门拘留中心,已致68人死亡
  • 主播说联播丨六部门出台新政!来华买买买,实惠多多多