【JavaEE“多线程进阶”】——各种“锁”大总结

8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯,

你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你!

目录

一:乐观锁和悲观锁

1:乐观锁

2:悲观锁

3:总结

二:轻量级锁和重量级锁

1:轻量级锁

2:重量级锁

3:总结

三:自旋锁和挂起等待锁

1:自旋锁

2:挂起等待锁

四:普通互斥锁和读写锁

1:普通互斥锁

2:读写锁

(0)知识联系

(1)此处解释

(2)总结

3:为什么引入读写锁

(1)场景一

(2)场景二

(3)优化

五:公平锁和非公平锁

1:两者对比

六:可重入锁和不可重入锁

七:synchronized自适应阶段

1:偏向锁阶段

2:轻量级锁阶段

3:重量级锁阶段

4:总结

八:锁消除

九:锁粗化

1:“粒度”

2:定义


一:乐观锁和悲观锁

1:乐观锁

在加锁过程中,预估发生锁冲突的概率小,降低加锁的工作量,加锁的效率就提高了,安全系数不高(可能会引发占用大量cpu资源的问题)

2:悲观锁

在加锁过程中,预估发生锁冲突的概率大,提升加锁的工作量,加锁的效率就下降了,但是安全系数高

3:总结

乐观锁——牺牲安全性换来效率

悲观锁——牺牲效率换来安全性

二:轻量级锁和重量级锁

引入:在乐悲观的基础上延伸出来的

1:轻量级锁

加锁的开销小,速度快——一般指乐观锁

2:重量级锁

加锁的开销大,速度慢——一般指悲观锁

3:总结

乐/悲观锁是加锁前对没有发生的事情的预估

轻/重量锁是加锁后对结果的评价

整体上来说,两者都是在对一件事情进行描述

三:自旋锁和挂起等待锁

1:自旋锁

自旋锁是轻量级锁的一种实现,也是乐观锁,通过与一个while循环搭配,如果获取到锁,那就结束循环;如果没有获取到锁,不会阻塞放弃cpu,而是继续下一次循环,直到获取到锁

(1)使用场景:锁冲突不激烈

(2)优点:其它线程一旦释放锁,就能快速获取到锁

(3)缺点:会占用消耗大量的cpu资源

2:挂起等待锁

挂起等待锁是重量级锁的一种实现,也是悲观锁,锁释放后并不能第一时间获取到锁,而是要通过操作系统的内核进行调度去获取锁,这个等待的过程时间较长。

(1)使用场景:锁冲突激烈

(2)优点:在内核调度的等待时间中,cpu可以做别的事情,即降低了cpu的资源消耗

(3)缺点:不能第一时间获取到锁

四:普通互斥锁和读写锁

1:普通互斥锁

与synchronized相似,可以进行加锁和解锁

2:读写锁

(0)知识联系

想想之前文章写到的MySQL事务处理——三读

“脏读”——给写加锁(写的时候不能读)

“不可重复读”——给读加锁(读的时候不能写)

“幻读”——读写都加上锁

(1)此处解释

读锁和读锁之间,不会发生锁冲突(不会阻塞)

写锁和写锁之间,会发生锁冲突(会阻塞)

读锁和写锁之间,会发生锁冲突(会阻塞)

(2)总结

一个线程加读锁的时候,另一个线程只能读,不能写

一个线程加写锁的时候,另一个线程只能写,不能读

3:为什么引入读写锁

(1)场景一

两个线程一起读,本身就是线程安全的不互斥,如果使用synchronized,就让两者互斥了

(2)场景二

如果一个线程读,一个线程写,也是不可以的(参考MySQL事务那一章节)

(3)优化

在实际开发中,本身读操作就是非常频繁的,引入读写锁可以大大节省下来“并发读”带来的锁冲突的资源消耗,

五:公平锁和非公平锁

1:两者对比

我们知道线程遵守“随机调度”的原则,所以在在加锁过程中就产生了“锁竞争”这一现象,在“Java”中规定公平就是遵守“先来后到”这一原则,synchronized本身就是非公平锁——一旦解锁,下一个加锁的线程是无法确定的。

所以我们引入队列,记录每个线程的顺序,依次加锁,实现“公平锁”

六:可重入锁和不可重入锁

一个线程对同一个对象加了两次锁,不会产生死锁,根据{}和内置的计数器来确定真正加锁和解锁的位置,synchronized就是可重入锁(推荐看看阿华之前写的那篇《多重入锁》文章哈)

系统自带的锁一般是不可重入锁。

七:synchronized自适应阶段

IDEA中提供的synchronized加锁具有自适应能力,内部会自动评估当前锁冲突的激烈程度,在乐观锁(系列:乐观锁,轻量级锁,自旋锁)和悲观锁(系列:悲观锁,重量级锁,挂起等待锁)中进行筛选。

这也是一种优化方式

1:偏向锁阶段

假设现在有一把偏向锁,A线程拿上了这把锁,不是真正意义上的加锁(假加锁),而是让这把锁对A线程有一个(轻量)标记,如果有其他的线程竞争也想要拿上这把锁,那A就会先一步加锁(真加锁)。

理解:

偏向锁标记是对象里头的一个属性,每个锁对象都有这么一个标记,锁对象首次被加锁都会先进入偏向锁阶段

如果没有锁竞争,那么下次加锁,还是会进入偏向锁阶段。

如果在加锁的过程中遭遇“锁竞争”,那么就会升级为“轻量级锁”阶段,

优点:非必要不加锁,没有锁竞争,偏向锁能大大提高效率

彩蛋:锁先生舔着女神A,女神A吊着锁先生就是不跟他确认关系,忽然有个姑娘B加入进来,想和锁先生确认关系,女神A就慌了~,赶快跟锁先生就确认男女朋友了,像极了爱情~~~

2:轻量级锁阶段

通过“自旋锁”的方式实现,synchronized内部也会统计有多少个线程在“锁竞争”,因为一旦超过某一个线程数量限制,大量的自旋锁会非常消耗cpu资源,此时就会升级为“重量级锁阶段”

优点:其他线程一旦释放锁,就能快速拿到锁

缺点:非常消耗cpu资源

3:重量级锁阶段

承接上文,此时线程放弃自旋锁,进入“阻塞等待”,当解锁后,系统在随机唤醒线程进行加锁。

4:总结

以上synchronized加锁的三个阶段是层层递进升级的,在目前Java中是不能够降级的,

八:锁消除

假如一个线程加了锁,但是一眼看过去这个线程肯定没有线程安全问题,那么在编译器编译代码的时候就会自动“消除锁”,提高效率。

针对一些模棱两可的代码,编译器不知道要不要加锁,统一都不会进行锁消除

九:锁粗化

1:“粒度”

synchronized{}花括号中的代码数量越少,则称锁的粒度越细;代码越多,锁的粒度越粗

2:定义

把多个细粒度的锁,合并成一个粗粒度的锁,就叫锁粗化

锁粗化也是为了提高效率,它跟可重入锁可不一样哦

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【工具分享】BarRax勒索病毒解密工具

前言 BarRax勒索软件首次出现于2017年,迅速在全球范围内扩散,主要针对Windows操作系统用户进行攻击。它通过使用AES-256和RSA-2048加密算法对受害者的文件进行加密,使文件变得不可访问。BarRax通常通过恶意电子邮件附件或伪装的软件下载进行…

【LeetCode】每日一题 2024_9_29 买票需要的时间(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 昨天的每日一题是线段树二分,题目难度远超我的能力范围,所以更不出来了 题目:买票需要的时间 代码与解题思路 func timeRequiredToBuy(tickets []int, k int) (sum in…

VisualGLM-6B——原理与部署

VisualGLM-6B技术原理介绍 VisualGLM-6B 是一种多模态预训练模型,它旨在将视觉和语言模型进行结合,使得语言模型能够理解图像信息并与文本对话无缝结合。为了更好地理解 VisualGLM-6B 的内容,我们可以从以下几个方面来解析它的原理、结构、训…

Mac小白必看,快速帮助新手入门的五款软件

刚转MacOS的小白是不是还不知道如何选择软件,MacOS与win有着很大的区别,对于新手来说,想要快速上手Mac的使用,少不了一款好的软件工具,今天给大家推荐五款适合刚转Mac的小白使用的好用工具。 1. iShot:截图…

IPD变革中,数据治理是关键

IPD变革中,数据治理是关键 2024-09-29 14:41汉捷咨询 华为轮值董事长徐直军先生在回顾IPD变革时,提到:“华为IPD变革前期,对数据的关注不够,没有系统梳理产品的信息架构和数据标准,也没有对业务流中的数据…

国内旅游:现状与未来趋势分析

在当今社会快速发展的背景下,国内旅游更是呈现出蓬勃的发展态势。中国,这片拥有悠久历史、灿烂文化和壮丽山河的广袤土地,为国内旅游的兴起与发展提供了得天独厚的条件。 本报告将借助 DataEase 强大的数据可视化分析能力,深入剖…

数据库入门不再难:克服学习障碍的实用技巧与演示

文章目录 摘要引言常见的学习困难及解决方法理解抽象的数据库概念SQL语句的构建与优化理解事务与并发控制 实用的学习技巧与工具推荐推荐学习资源数据库设计与实践的常用技巧 实战演练常见问题解答总结未来展望参考资料 摘要 数据库学习对于初学者来说,往往会面临诸…

优思学院|六西格玛黑带是什么?取得六西格玛黑带证书有何作用?

1. 六西格玛黑带是什么? 六西格玛黑带(Black Belt)是六西格玛项目中的高级专业人员,负责领导跨职能团队,使用统计分析工具和方法,深入分析业务流程中的问题并制定改进方案。黑带要具备扎实的六西格玛知识&…

HTTP协议代码实现

目录 一. 服务端模块实现 二. HTTP协议模块实现 2.1 HTTP请求部分: 2.2 HTTP响应部分: 2.3 工厂类部分: 2.4 HTTP服务端部分: 2.5 回头处理业务处理函数: 三. 调用服务端模块实现 四. 具体效…

【含文档】基于Springboot+Vue的高校奖助学金系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

柯桥学英语商务口语中老外最爱说的“what‘s up“是什么意思?回答错超尴尬!

“Whats up?” 在看美剧或者和老外聊天的时候 我们总能听到这句话 那你知道这句老外很爱说的 “whats up”是什么意思吗? 快和小编一起来学习吧~ 01 whats up 怎么理解? 很多人觉得Whats up就是更地道的“How are you”,嗯………

【vue3】防抖与节流

1.防抖 (多次触发 只执行最后一次) 作用: 高频率触发的事件,在指定的单位时间内,只响应最后一次,如果在指定的时间内再次触发,则重新计算时间防抖类似于英雄联盟回城6秒,如果回城中被打断&…

怎么查看员工电脑安装了什么软件

1、使用专业监控软件:安装如金刚钻信息网站行为审计系统、WorkWin等专业的电脑监控软件。这些软件能够实时监控员工的电脑操作,包括安装的软件、运行的程序等。通过软件的管理端,您可以轻松查看员工电脑上安装的所有软件,并可以设…

Library介绍(二)

时序弧(timing arc) 描述2个节点延迟信息的数据,可以分为net delay和cell delay两大类。 Net delay: drive cell output pin和drived cell input pin之间的net delay,取决于net rc和drive cell驱动能力及drived cell的load。 C…

为什么需要数字集群手持终端?应用优势

在当今社会,无论是应急响应、企业运营还是政府管理,高效、可靠的通讯手段都是成功的关键因素。数字集群手持终端,作为现代通信技术的代表,正成为提升通信效率和确保信息安全的强大工具。据统计,我国的数字集群网络已发…

红蓝攻防实战技术———实战化运营体系的落地

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二…

ZYNQ:点亮LED灯

FPGA 开发流程 1、需求分析:分析需要实现什么功能 2、系统设计:对系统进行设计,需要哪些模块,实现什么功能,数据流怎么走,带宽、工作频率怎么样 3、硬件选项:根据功能、性能需求选择合适的FPGA…

安防区域保护:无线电干扰设备技术详解

在安防区域保护中,无线电干扰设备技术扮演着重要角色,它主要用于通过发射特定频率的无线电波来干扰无人机或其他无线电设备的通信链路、导航信号或控制信号,以达到削弱、阻断甚至控制这些设备运行的目的。以下是对无线电干扰设备技术的详细解…

宝塔环境下MinDoc的安装教程

安装 本教程只适用于CentOS 7,其它系统教程参考:Github地址。 1、下载MinDoc并解压 访问https://github.com/mindoc-org/mindoc/releases下载最新版本并解压 #创建一个目录 mkdir mindoc && cd mindoc#一般宝塔带wget和unzip,如果…

大数据新视界 --大数据大厂之Cassandra 分布式数据库在大数据中的应用与调优

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…