【多线程】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概…

算法矩阵提速原理

不管是图形还是AI&#xff0c;如果看过相关的算法&#xff0c;都会注意到矩阵运算&#xff0c;很多讲算法的教程都会说将for转换成矩阵&#xff0c;可以极大的增加效率。 但是这不是为难我们这些数学低能儿吗&#xff1f;矩阵运算这些高级货算是高级数学了&#xff0c;比CURD还…

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

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

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

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

docker基础知识-01

Docker是什么 Docker是一个开源的容器化平台&#xff0c;用于开发、打包和运行应用程序。它允许开发者将应用程序及其所有依赖项打包到一个可移植的容器中&#xff0c;然后可以在任何支持Docker的环境中运行。Docker的主要优势是可以在不同的操作系统、云服务和物理机上快速、…

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

前言 二叉树的学习离不开对堆的理解&#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;编…

如何进行嵌入式软件的测试和认证

嵌入式软件是指被安装在嵌入式设备中的软件&#xff0c;例如数字电视、洗衣机、手机游戏等。嵌入式软件经过分析、设计和编码后&#xff0c;必须被烧入硬件环境才能运行&#xff0c;因此嵌入式软件测试是针对嵌入式系统的特殊测试方法。 嵌入式软件调试&#xff0c;主要有以下…

代码随想录算法训练营一刷总结篇

去年12月份的时候开始陆续刷题&#xff0c;开始刷了半个多月&#xff0c;后来因为研究生开题答辩&#xff0c;停刷了半个月&#xff0c;到1月上旬又是拖了一个星期才开始继续刷的。感觉自己一个人刷题经常就会因为一些事情&#xff0c;很容易就停刷&#xff1b;刷过的题也不记得…

Linux 上清理 SSSD Cache

1. 简介 系统安全服务守护程序 (SSSD) 提供对身份和身份验证提供程序的访问。 基本上&#xff0c;SSSD 不依赖于本地配置的身份验证&#xff0c;而是用于查找其本地缓存。 此缓存中的条目可能来自不同的远程身份提供商&#xff0c;例如 LDAP 目录、FreeIPA 或 Active Director…

HOT100与剑指Offer

文章目录 前言一、763. 划分字母区间&#xff08;HOT100&#xff09;二、6. 从尾到头打印链表&#xff08;剑指Offer&#xff09;总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划刷完hot100和剑指Offer的刷题计划&#xff0c;加油&#xff01; 根据要…

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 本题就是统计有多少个字母的大小写同时出现…

架构权衡评估方法(ATAM):一种用于软件架构评估的方法,全称为Architecture Tradeoff Analysis Method

架构权衡评估方法(ATAM)是一种用于软件架构评估的方法,全称为Architecture Tradeoff Analysis Method。它由卡梅隆大学软件工程协会提出,旨在通过分析软件系统的各种架构特征,对系统进行全面的评估,以便在各种可能的方案中做出最佳的决策13。ATAM的核心是结合质量属性效用…

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

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