【多线程】synchronized原理 | 锁升级| 锁消除 | 锁粗化 | 信号量 | CountDownLatch

文章目录

    • 一、synchronized原理
        • synchronized属于哪种锁?
      • 1.锁升级
        • 偏向锁:
      • 2.锁消除
      • 3.锁粗化
        • 锁的粒度
    • 二、信号量 Semaphore
    • 三、CountDownLatch
        • 1.await方法
        • 2.countDown方法


一、synchronized原理

synchronized属于哪种锁?

​ 在初始情况下,synchronized会预测当前锁冲突的概率不大。此时以乐观锁的方式来运行(此时也是轻量级锁,以自旋锁的方式实现)。在实际使用的过程中,如果发现锁冲突的情况比较多,synchronized就会升级成悲观锁(也就是重量级锁,基于挂起等待的方式实现)。

1.对于“ 悲观乐观 ”,是自适应的

2.对于“ 重量轻量 ” ,是自适应的。

3.对于“ 自旋 和 挂起等待 ” ,也是自适应的。

4.不是读写锁。

5.是可重入锁。

6.是非公平锁。

1.锁升级

无锁 ->偏向锁->自旋锁(轻量级锁)->重量级锁

  • 锁升级的过程是单向的,不会降级。
  • 锁升级的过程,就是在 性能 和线性安全之间尽量进行权衡。
偏向锁:

线程池,优化的是创建新线程的效率(优化”找下一任“的效率),提前就创建好,直接拿来用,无缝衔接

偏向锁,(优化了”分手“的效率)

​ 偏向锁不是真的加锁,只是做了一个标记。即使后续要解锁,因为本来就没有加锁,也不用真的去释放锁。也就省下了加锁解锁的开销。当锁冲突出现的时候,偏向锁就会升级成轻量级锁,进行真正的加锁操作。这样既能够保证效率,也能够实现线程安全。

​ 偏向锁就是一个捞女,对舔狗加了微信。一直和舔狗搞暧昧,没有对象之名,却享受着舔狗的好处。拉扯距离,一直不明确关系。如果捞女玩腻了,就可以正大光明的拉黑舔狗的微信,因为本来就不是情侣关系,只是“普通朋友”。以比较高的效率完成分手的操作。如果此时,有别的捞女看上舔狗了,对此时的捞女构成了威胁。出现了“锁竞争“。之前搞暧昧的捞女,就会立刻和舔狗表白,确定情侣关系(抢先加锁)。

偏向锁 的核心思想,就是“懒汉模式” 的一种体现,能不加锁就不加锁,因为加锁就意味着开销。

2.锁消除

  • 锁消除,也是一种编译器优化的手段

​ 编译器+JVM会自动针对你自己写的加锁代码,进行判定。如果编译器认为当前的场景不需要加锁,就会把你自己写是synchronized优化掉

比如: StringBuilder ( 不带synchronized) 和 StringBuffer(带有synchronized)

如果在单个线程中使用StringBuffer,此时编译器就会自动把synchronized优化掉。

编译器只有在非常有把握的情况下,才会进行所消除。(触发概率不算很高)

相比之下,偏向锁是运行时的一种策略。锁消除是在编译阶段。

3.锁粗化

  • 同样也是编译器优化的手段
  • 一段逻辑中如果出现多次加锁解锁, 编译器 + JVM 会自动进行锁的粗化
锁的粒度

synchronized当中,代码越多,就认为锁的粒度越粗。代码越少,锁的粒度越细。

​ 锁的粒度细的时候,能够并发执行的逻辑更多,更有利于充分利用多核CPU资源。但是如果粒度细的锁,被反复进行加锁解锁,可能实际效果还不如粒度粗的锁。(涉及到反复的锁竞争)

比如领导给你安排了三个工作,完成之后,就可以打电话给领导进行汇报。于是你每完成应之后,就打电话汇报一次。但是如果你真敢这么干,领导会红温。不如一次性进行汇报。给领导打电话就是对领导进行加锁,每次进行加锁的时候,都会涉及到锁竞争。(毕竟领导也有手头工作)此时,不如只加一次锁,合在一起进行汇报。


二、信号量 Semaphore

​ 迪杰斯特拉提出的信号量,同时,他也是一位荷兰数学家,在数据结构的图中,要想获取两点之间的最短路径,就可以用迪杰斯特拉算法。 PV就是荷兰语的单词首字母。

  • 本质上就是一个计数器,描述的是“可用资源的个数”。
  • P操作:每次申请资源,让计数器-1,
  • V操作:每次释放资源,让计数器+1.(都是原子操作)

例如,停车场门口的计数牌用来显示空车位,进去一辆车,车位减一,出来一辆车,车位加一。此时可用资源就是车位。

如果可用资源为0,还要进行P操作,就会进行阻塞等待,直到其他线程执行V操作为止。

锁的本质上,就是一种可用资源为1的二元信号量。有加锁解锁两种状态。

信号量是一种广义的锁,锁是一种特殊的信号量。

  • 操作系统提供了信号量的实现,并且提供了API。JVM封装了API,就可以在Java代码中使用了。
        Semaphore semaphore = new Semaphore(3);semaphore.acquire();	    //P操作semaphore.release();//V操作

在开发中如果遇到了申请资源的场景,就可以用信号量来实现。

三、CountDownLatch

  • 同时等待N个任务执行结束

​ 适用于多个线程完成一系列任务的时候,用来衡量任务的进度是否完成。为了完成一个大的任务,把任务拆分成多个小的任务,让这些任务并发的进行执行。用CountDownLatch来判定当前的任务是否全部完成。

​ 比如IDM下载软件,能够多线程进行下载。平常的下载方式,资源和服务器只有一个连接,服务器往往会对于连接传输的速度进行限制。而多线程下载,每个线程都建立一个连接,负责其中的一部分任务。从而提高速度。

1.await方法
  • 调用的时候就会阻塞,等待其他的线程完成任务。当所有的线程都完成任务后,此时await才会返回,继续向下执行。
2.countDown方法
  • 告诉CountDownLatch,当前的一个子任务已经完成。

    每个线程完成后,调用countDown方法

    public static void main(String[] args) throws InterruptedException {//10个选手参赛,await会等10个人都跑完之后再继续执行CountDownLatch countDownLatch = new CountDownLatch(10);for (int i = 0; i < 10; i++) {int id = i;Thread thread = new Thread(() -> {System.out.println("thread" + id);try {Thread.sleep(500);} catch (InterruptedException e) {throw new RuntimeException(e);}countDownLatch.countDown();//通知当前的子任务执行完毕});thread.start();}countDownLatch.await();System.out.println("所有的任务结束");
thread0
thread4
thread5
thread6
thread3
thread2
thread1
thread9
thread8
thread7
所有的任务结束

点击移步博客主页,欢迎光临~

偷cyk的图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/2089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【oceanbase】安装ocp,ocp部署oceanbase

https://www.oceanbase.com/docs/common-ocp-1000000000584989 资源 iphostnamecpumem组件192.168.0.71obnode-000-071816oceanbase-ce192.168.0.72obnode-000-072816oceanbase-ce192.168.0.73obnode-000-073816oceanbase-ce192.168.0.74obproxy-000-07424obproxy-ce192.168.0…

【Java EE】网络初识

目录 1.网络发展史 2.局域网LAN 2.1组建方式 2.1.1基于网线直连 2.1.2基于集线器组建 2.1.3基于交换机组建 2.1.4基于交换机和路由器组建 3.广域网WAN 4.网络通信基础 4.1 IP地址 4.1.1概念 4.1.2格式 4.1.3端口号 4.1.3.1概念 4.1.3.2格式 4.2认识协议 4.2.1概…

Qt 跨平台开发的一丢丢总结

Qt 跨平台开发 文章目录 Qt 跨平台开发摘要第一 \ & /第二 神奇{不能换行显示第三 预处理宏 关键字&#xff1a; Qt、 win、 linux、 lib、 MSVC 摘要 最近一直在琢磨Qt跨平台开发的问题&#xff0c;缘由有以下几个&#xff0c; 首先第一个&#xff0c;我们目前开发…

医院敏感文件交互 如何保障安全和效率?

医院会产生大量的敏感文件&#xff0c;这些敏感文件交互时&#xff0c;都需要使用特殊的手段&#xff0c;来保障数据的安全性。 医院的敏感数据主要包括以下几类&#xff1a; 1、患者基本信息&#xff1a;包括患者的姓名、身份证号码、户籍地或现住址、联系方式、文化程度、既…

【数据结构】二叉树链式结构的实现《遍历,实现》(题库+解析+源码)

前言 二叉树的学习离不开对堆的理解&#xff0c;这是上篇堆的传送门 http://t.csdnimg.cn/F6Jp3 1.二叉树链式结构的实现 1.1 前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在大家对二 叉树结构掌握还…

【LLM】向量知识库

文章目录 认识向量知识库向量Embeddings向量数据库向量数据库的作用向量数据库与传统数据库的区别 Embedding API使用公有Embedding API自定义一个Embeedding API 常见文本数据的预处理搭建并使用向量数据库思考向量数据库在LLM中的价值体现向量的妙用&#xff0c;可行&#xf…

gcc,软硬链接和制作动静态库

gcc的操作 预处理 gcc -E file.c -o file.i -E选项表示预处理完就停下来&#xff0c;在编译时-o file.i可以省略&#xff0c;编译器会默认生成同名的.i文件 编译 gcc -S file.i -o file.s -s表示生成完汇编码就停下来&#xff0c;在编译时-o file.s可以省略&#xff0c;编…

kaggle电子邮件分类xgboost建模可视化模型评估混淆矩阵范例

目录 概述 依赖环境 代码解读 库的导入 数据读取 扇形图可视化统计 词云图可视化 分布条形图可视化 数据预处理 划分数据集 模型训练 模型预测和评估 ROC曲线评估 混淆矩阵评估 多维度交叉评估 配套源码和数据集 xgboost邮件分类配套数据集和源码下载地址 概述…

DenseDiffusion:Dense Text-to-Image Generation with Attention Modulation

1 研究目的 该文献的研究目的主要是&#xff1a; 探讨一种更为广泛的调制方法&#xff0c;通过设计多个正则化项来优化图像合成过程中的空间控制。论文的大致思想是&#xff0c;在现有的基于数据驱动的图像合成系统基础上&#xff0c;通过引入更复杂的调制策略&#xff0c;实现…

pip下载包opencv出错(报错failed building wheel for opencv-python解决方法)

文章目录 1 报错2 原因3 解决方法参考 1 报错 ERROR: Could not build wheels for opencv-python, which is required to install pypr2 原因 版本不兼容的问题,当使用pip install opencv-python命令安装的是最新版本&#xff0c;当前python版本不支持。需要安装当前版本pyth…

认识产品经理

一、合格的产品经理 1、什么是产品 解决某个问题的东西&#xff0c;称为产品 键盘可以打字&#xff0c;想喝水了可以用水壶&#xff0c;在超市想找一款扫把会有导购员服务 产品有颜色、大小等等区别&#xff0c;也有有形和无形的区别 2、什么是产品经理 想清楚怎么设计产品…

Leetcode - 周赛394

目录 一&#xff0c;3120. 统计特殊字母的数量 I 二&#xff0c;3121. 统计特殊字母的数量 II 三&#xff0c;3122. 使矩阵满足条件的最少操作次数 四&#xff0c;3123. 最短路径中的边 一&#xff0c;3120. 统计特殊字母的数量 I 本题就是统计有多少个字母的大小写同时出现…

Kimi Chat四大更新详细解读!模型能力提升,支持语音输入输出!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

SpringBoot集成Sharding-JDBC实现主从同步

SpringBoot集成Sharding-JDBC实现主从同步 1.mysql主从配置2.application.properties文件配置3.测试3.1 查询数据3.2 添加数据 1.mysql主从配置 详细内容请参考上一篇文章&#xff1a;MySQL8.0以上实现主从同步配置 2.application.properties文件配置 # ShardingSphere conf…

阿斯达年代记怎么下载 阿斯达年代记三强争霸下载教程

阿斯达年代记怎么下载 阿斯达年代记三强争霸下载教程 阿斯达年代记是一款三国争霸类型的游戏&#xff0c;在游戏中大家可以体验到三权争霸的刺激场景&#xff0c;在战场中大家不仅可以体验到体验到文化交织还可以感受到战场的残酷&#xff0c;本期小编将会给大家带来阿斯达年代…

基于vue+node+mysql的视频校对系统

一、登录注册&#xff1a;包括登录&#xff0c;注册&#xff0c;忘记密码&#xff0c;验证码等常用点。 二、用户管理&#xff1a;包括用户的增删改查 三、权限管理&#xff08;请增加这个权限&#xff1a;任务分配——只有管理者才能发布和删除任务&#xff1b;管理员设置。 四…

R语言绘制动态网络图Network教程WGCNA

今天分享的笔记是使用NetworkD3对WGCNA的共表达网络进行可视化&#xff0c;创建交互式动态网络图&#xff0c;展示基因之间的相互关系&#xff0c;可以用于转录组或者其他调控网络展示。 加权基因共表达网络分析 (WGCNA, Weighted correlation network analysis)是用来描述不同…

MQTT服务器EMQX的安装和使用(Windows)

一、下载地址&#xff1a; 下载 EMQX 二、安装环境&#xff1a; Windows Server2016 16G 500G 三、启动服务&#xff1a; 下载文件解压后放入以下目录&#xff08;注意&#xff0c;目录名一定是英文&#xff0c;否则会造成启动不成功&#xff01;&#xff09;&#xff1a…

mybatis与mybatisplus

mybatis 基本使用 整合springboot 1.添加依赖 2.添加配置 spring:# 数据源相关配置datasource:username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver#时区必须配置否则报错,注意数据库名切换为自己的数据库名称url: jdbc:mysql://127.0.0.1/ithei…

论文略读:OpenGraph: Towards Open Graph Foundation Models

arxiv 2023 1 intro Graph大模型希望OpenGraph能够捕捉通用的拓扑结构模式&#xff0c;对测试数据进行Zero-shot预测 仅通过前向传播过程&#xff0c;就可以对测试图数据进行高效的特征提取和准确预测模型的训练过程在完全不同的图数据上进行&#xff0c;在训练阶段不接触测试…