总结多线程的各种锁

1、公平锁和非公平锁

        公平锁是严格按照线程请求的顺序来分配锁,每一个线程都能获取到锁,避免线程饥饿现象;相反,非公平锁表示线程竞争锁时可以插队来抢占资源。

        非公平锁在大多数情况下效率优于公平锁,因为公平锁涉及到线程状态的切换,这是一笔很大的开销;

        举例:当我们使用非公平锁时,如果线程A释放锁之后,本来应该唤醒队列中的线程B,此时却被没有进入到阻塞队列的线程C截胡了,线程C竞争到锁之后就直接执行业务逻辑,就不需要再进入到阻塞队列了,这样就省去了后续再唤醒线程C而带来的性能开销,当然,这对于原本需要唤醒的线程B是不公平的,但是却提升了锁竞争的性能。

        synchronized和ReentrantLock默认都是非公平的,ReentrantLock可以设置为公平锁,synchronized不能。

2、乐观锁和悲观锁

        乐观锁表示线程在更新数据时,认为不会有其它线程对数据进行修改,因此不需要加锁,但是在更新时会判断此期间有没有被别的线程修改过数据。具体实现:JUC包下的原子类的实现,就是使用乐观锁+CAS实现的。

        悲观锁在更新数据时,认为其它线程会更新数据,因此会加锁,别的线程想要修改数据,就必须获取锁,获取不到锁就被阻塞。具体实现:synchronized和ReentrantLock这种独占锁都是悲观锁的具体实现。

3、死锁

        两个线程互相获取对方已经拥有的资源而形成的对峙局面,成为死锁。在没有外部条件的干涉下,程序无法向下执行,一直阻塞。

        破局:得不到就放弃。设置获取锁的次数,超过该次数还没拿到锁,就放弃当前已经有用的资源,从而打破死锁。

4、活锁

5、可重入锁

        线程在抢占到一个互斥锁资源后,在释放锁之前,再去竞争同一把锁时,无需等待,只需要记录重入的次数。

        常见的可重入锁,synchronized和ReentrantLock。

        可重入锁主要为了避免死锁。线程获取到X锁,在释放之前再次获取X锁,那就是自己和自己竞争,如果不可重入,那就会出现死锁。

6、共享锁和独占锁

        共享锁是指锁可以被多个线程所持有,数据加上共享锁之后,其他线程也只能加共享锁。

        共享锁只能读取数据,不能修改数据。

        独占锁是一次只能有一个线程持有锁,加上独占锁之后,其他线程无法对数加锁。

        独占锁可以修改数据,也可以读取数据。

        具体实现:ReentrantReadWriteLock称为读写锁,里边有两把锁,一把读锁,一把写锁;读锁是共享锁,写锁是独占锁,两者不能同时存在。

        因为独占锁是一种过于严格的加规则,限制了并发。避免了写/写冲突,读/写冲突,但是也避免掉了读/读冲突。在大多数情况下都是读的场景,因此使用共享锁就可以提升性能。ReentrantReadWriteLock适用于读多写少的场景。

7、读写锁

        读写锁管理一组锁,一个是读锁,一个是写锁。

        读锁在没有写锁的情况下可以被多个线程共享;相反,写锁只能独占。

        写锁的优先级高于读锁。

8、互斥锁

         互斥锁是独占锁的一种具体实现,指某一个资源在同一时刻只能被一个线程访问,具有唯一性排他性。       

9、自旋锁

        线程没有获取到锁时,不是被直接挂起,而是执行一个忙循环,这个忙循环就是自旋。自选的目的是为了减小线程被挂起的概率,因为线程的挂起和唤醒也都是耗费资源的。

        一个特殊的情况是另一个线程占用所得时间很长,导致当前线程自旋时间也很长,之后线程还是会被挂起,那么这个自选操作就是读对系统资源的浪费,反而降低系统性能。

        具体实现:AtomicInteger原子类的getAndAddInt()方法,一个do-while循环,不断获取当前值Value,然后重试,循环退出条件为CAS返回true。

        优化:JDK1.6引入了自适应自旋,根据获取当前锁的上一个线程的自旋时间以及锁的拥有者的状态决定。如果虚拟机认为会成功,就多点自旋时间;如果认为会失败,那可能会将线程直接挂起,避免自选。

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

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

相关文章

ArrayList 与 LinkedList 区别?

如果你现在需要准备面试,可以关注我的公众号:”Tom聊架构“,回复暗号:”578“,领取一份我整理的50W字面试宝典,可以帮助你提高80%的面试通过率,价值很高!! 是否保证线程安…

竞赛保研 基于深度学习的人脸识别系统

前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的人脸识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/…

java.io.IOException: Broken pipe

做1个接口,处理前端请求图片跨域的问题。由于前端拿图片的时候,有跨域问题,所以让后台先拿到图片,然后再写给前台。本来下面的代码没什么太大的问题,但是如果前台请求的图片一多(1个页面中有很多图片&#…

Linux查看物理CPU个数、逻辑CPU个数、核数

Linux下如何判断服务器是虚拟机还是物理机? 1.systemd-detect-virt在虚拟环境中检测执行 ,它可以识别虚拟化技术,并且可以将完整的VM虚拟化与容器虚拟化区分开来。 systemd-detect-virt退出,返回值为0(成功&#xff0…

如何脱离keil在vscode上实现STM32单片机编程

【VScode Embedded IDE】Keil工程导入VScode,与Keil协同开发MCU_vscode编辑keil工程-CSDN博客 从零开始的51单片机——VsCodeEIDE环境搭建_vscodeeidesdcc-CSDN博客 结合一下这两个大佬的博客就是可以实现STM32的编程了 主要要点: (1&#…

Vue应用多语言支持工程化最佳实践

前言 VoerkaI18n是一款非常优秀的全新的开源国际化多语言解决方案,主要特性包括: 全面工程化解决方案,提供初始化、提取文本、自动翻译、编译等工具链支持。符合直觉,不需要手动定义文本Key映射。强大的插值变量格式化器机制&am…

为什么要有虚拟线程(Java项目Loom)?

JEP No 425 是我期待已久的东西。这是 JDK 19 的并发 API 中添加的一个新概念。它处于预览阶段,很快它将在未来的几个版本中成为 JDK 中的永久功能。 虚拟线程非常轻量级,可以减少编写、维护和观察高吞吐量应用程序的工作量。 在这一部分中&#xff0c…

Spring——Spring整合MyBatis

Spring整合MyBatis 1.创建工程 1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

HarmonyOS 编写副标题 解决 ubTitle 可能淘汰问题

目前 harmonyos 中 title属性目前用的还正常 但是ubTitle副标题 会提示我们 可能要淘汰了 虽然说 我们目前 强行用 还是可以生效 但可能 哪天版本更新移除了这个属性 代码就报错了 我们可以通过Builder 来写这个副标题 和 标题 Entry Component struct Index {build() {Row(…

海外社媒运营为什么需要选择优质IP代理?

跨境电商卖家尤其需要关注海外社媒运营&#xff0c;想要更好地运营Instagram、Facebook、TikTok 或 Twitter等&#xff0c;挖掘社媒潜力需要采取战略方法&#xff0c;而社交媒体IP代理在这一活动中发挥着至关重要的作用&#xff0c;下面为你详细介绍。 一、社交媒体代理IP及其运…

【SkyWant.[2304]】路由器操作系统,移动【Netkeeper】使用教程校园网

目录 步骤一&#xff1a;正确连接网线&#xff0c;插电开机正确连接网线&#xff1a; 认识系统灯&#xff1a; 插电开机&#xff1a; 步骤二&#xff1a;开机之后&#xff0c;系统的基本设置 1.进入设置界面&#xff1a; 2.设置辅助热点wifi&#xff1a; 3.设置日常…

ROS2 Humble学习笔记

本文发表与个人的github pages。部分内容未同步到这里。 想查看完整内容&#xff0c;请移步到ROS2 Humble学习笔记。 一、前言 2013年的时候已经接触ROS了&#xff0c;当时断断续续学习了一些ROS的基础知识。16年搬到深圳之后&#xff0c;也有幸参加过星火的一次关于ROS的一些…

变电站综合自动化监控系统在某物流园35kV变电站中应用

摘 要&#xff1a;Acrel-1000变电站综合自动化系统&#xff0c;是我司根据电力系统自动化及无人值守的要求&#xff0c;总结国内外的研究和生产的先进经验&#xff0c;专门研制出的新一代电力监控系统。本系统具有保护、遥测、遥信、遥脉、遥调、遥控功能&#xff0c;可实现无人…

如何通过绘制【学习曲线】来判断模型是否【过拟合】

学习曲线是一种图形化工具&#xff0c;用于展示模型在训练集和验证集&#xff08;或测试集&#xff09;上的性能随着训练样本数量的增加而如何变化。它可以帮助我们理解模型是否受益于更多的训练数据&#xff0c;以及模型是否可能存在过拟合或欠拟合问题。学习曲线的x轴通常是训…

数据结构之B树和B+树

数据结构可视化演示链接&#xff0c;也就是视频中的网址 文章目录 一、B-Tree二、BTree(B-Tree变种) 一、B-Tree 样例图 叶节点具有相同的深度&#xff0c;叶节点的指针为空所有索引元素不重复节点中的数据索引从左到右递增排列 二、BTree(B-Tree变种) 样例图 非叶子节…

ThreadLocal内存泄漏与解决

目录 什么是Threadlocal&#xff1f; Threadlocal的基本使用 ThreadLocal的内存泄漏举例 场景1 场景2 场景3 场景4 内存泄漏原因分析 总结 什么是Threadlocal&#xff1f; ThreadLocal 是 Java 中的一个类&#xff0c;它提供了线程本地变量的支持。线程本地变量是指被…

Qt之单步调试

Qt Creator 单步调试功能介绍 Qt Creator 是 Qt 官方提供的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;它支持 C 开发&#xff0c;包括 Qt 应用程序的开发。以下是在 Qt Creator 中使用单步调试的基本步骤&#xff1a; 步骤 1&#xff1a;打开项目 首先&#…

Win10子系统Ubuntu实战(一)

在 Windows 10 中安装 Ubuntu 子系统&#xff08;Windows Subsystem for Linux&#xff0c;简称 WSL&#xff09;有几个主要的用途和好处&#xff1a;Linux 环境的支持、跨平台开发、命令行工具、测试和验证、教育用途。总体而言&#xff0c;WSL 提供了一种将 Windows 和 Linux…

Python库中关于时间的常见操作

目录 导入所需的库 获取当前时间 格式化日期和时间 解析日期和时间字符串 时间戳操作 获取当前时间戳&#xff1a; 将时间戳转换为日期和时间&#xff1a; 时间差操作 时间日期的时区处理 时间日期的随机生成 注意事项 总结 在Python中&#xff0c;时间处理是一个重…

Low Poly Cartoon House Interiors

400个独特的低多边形预制件的集合,可以轻松创建高质量的室内场景。所有模型都已准备好放入场景中,并使用一个纹理创建,以提高性能!包含演示场景! 模型分类: - 墙壁(79件) - 地板(28块) - 浴室(33个) - 厨房(36件) - 厨房道具(68件) - 房间道具(85件) - 灯具(…