多线程--常见锁策略--Java

目录

一、悲观锁VS乐观锁

1.悲观锁

2.乐观锁

二、重量级锁VS轻量级锁

1.重量级锁

2.轻量级锁

三、自旋锁

1.自旋锁概念

四、公平锁VS非公平锁

1.公平锁

2.非公平锁

3.注意

五、可重入锁和不可重入锁

六、读写锁

1.线程对于数据的访问方式


注意:以下讲解的锁策略不止局限于Java,任何和“锁”有关的话题都会牵扯到以下的内容,这些特性主要是给锁的设计者来参考的。

普通的程序员也需要了解一下,这对合理的使用锁有很大的帮助。

一、悲观锁VS乐观锁

1.悲观锁

总是假设最坏的情况,也就是每次拿到数据都会认为这个数据会被别人拿到修改,所以在每次拿到数据都会加上锁,这样别人想要获取数据就会阻塞直到它拿到锁。

2.乐观锁

假设数据一般情况下不会产生并发冲突,所以在数据提交更新的时候才会对数据是否会产生并发冲突进行判断,如果发现并发冲突就会给返回一个用户错误信息,让用户来决定怎么做。

举例来说:同学A和同学B向老师请教问题。

同学A认为老师是很忙的,去问问题老师大概率在忙不能帮他解决问题,所以他先给老师发信息问“老师您有空吗?我可以问个问题吗?”(相当于加锁操作)得到肯定的答复后,他才会真的去向老师问问题,得到否定的答复后,他会再等一段时间等到老师空闲的时候问问题,这个就是悲观锁。

同学B认为老师是比较闲的,去问问题老师大概率是有时间解答的,所以他直接去找老师(没加锁,直接访问资源)如果老师比较闲,问题直接就解决了,如果老师正好在忙,那么他也不会打扰老师,下次再来(虽然没加锁,但是能识别出数据访问冲突),这个就是乐观锁。

这两种思路并不能说谁优谁劣,要看当前场景适合哪种锁。

我们Java的Synchronized初始情况下是乐观锁,在运行过程中发现锁竞争频繁后会自动转为悲观锁。

就好⽐同学 C 开始认为 "⽼师⽐较闲的", 问问题都会直接去找⽼师. 但是直接来找两次⽼师之后, 发现⽼师都挺忙的, 于是下次再来问问题, 就先发个消息问问⽼师忙不忙, 再决定是否来问问题。

二、重量级锁VS轻量级锁

首先我们要明白锁的核心特性“原子性”这样的机制追根溯源可以追溯到CPU这样的硬件设备提供。

CPU提供了“原子性操作”。

操作系统通过CPU的原子指令实现了mutex互斥锁

JVM基于操作系统提供的互斥锁,实现了Synchronized 和ReentrantLock等关键字和子类。

1.重量级锁

加锁机制重度依赖OS提供的mutex。

大量的内核态用户态切换;很容易引发线程调度。

这两个操作的成本都很高,一旦引发了内核态和用户态的切换就意味着“沧海桑田”。

2.轻量级锁

加锁机制尽可能不使用OS提供的mutex,尽量在用户态代码完成,实在不行了在使用mutex。

少量的内核态用户态切换;不容易引发线程调度。

synchronized 开始是⼀个轻量级锁. 如果锁冲突⽐较严重, 就会变成重量级锁

三、自旋锁

按之前的方式,线程在抢锁失败后就会进入阻塞状态,放弃CPU,下次再次调用该线程就不知道是什么时候了。实际上,在线程抢锁失败后用不了多长时间,锁就会被释放,没必要放弃CPU,这时我们就可以使用自旋锁来解决这样的问题。

1.自旋锁概念

综上所述,在一个线程抢锁失败后,它会立即再次尝试获取锁,无限循环,这样在该锁释放的时候它能够立刻获取到锁。

自旋锁是一种典型的轻量级锁的实现方式:

优点:没有放弃CPU,不涉及线程的调度和阻塞,能够第一时间获取到锁。

缺点:如果锁被其他线程获取的时间比较长,就会持续不断的消耗CPU资源(挂起等待是不需要消耗CPU资源的)

Synchronized中的轻量锁策略大概率就是通过自旋锁的方式实现的。

四、公平锁VS非公平锁

假设有ABC三个线程,A线程先获取到锁,B线程尝试获取锁失败阻塞等待,C线程再尝试获取锁失败阻塞等待,那么当A线程释放锁后哪个线程获取到锁呢?

1.公平锁

遵守先来后到的规则,B线程比C线程更早尝试获取锁,所以B线程获取到锁。

2.非公平锁

不遵守先来后到的规则,BC两个线程都有可能获取到锁。

这就好比一群男生追一个女生,当女生和前任分手后,她挑选了追她最久的做男朋友这就是“公平锁”,如果她随机挑了一个她看着顺眼的这就是“非公平锁”。

3.注意

操作系统中线程的调度时随机的,如果不做任何限制的话,那么锁就是非公平锁,如果要实现公平锁需要用额外的数据结构来记录每个线程尝试获取锁的时间来实现公平锁。

公平锁和非公平锁直接没用优劣之分,具体看使用场景。

Synchronized实现的是非公平锁。

五、可重入锁和不可重入锁

可重入锁可以根据字面意思来理解,就是可以重复进入的锁,也就是说一个线程可以重复获取统一把锁,

⽐如⼀个递归函数⾥有加锁操作,递归过程中这个锁会阻塞⾃⼰吗?如果不会,那么这个锁就是可重 ⼊锁(因为这个原因可重⼊锁也叫做递归锁)。
Java⾥只要以Reentrant开头命名的锁都是可重⼊锁,⽽且JDK提供的所有现成的Lock实现类,包括 synchronized关键字锁都是可重⼊的。
⽽ Linux 系统提供的 mutex 是不可重⼊锁。
不可重入锁也就是一个线程重复获取同一把锁会产生“死锁问题”,也就是同一个线程内产生了阻塞,导致程序崩溃。

六、读写锁

多线程之间,数据的读取方之间不需要进行互斥,数据的写入方之间和写入方和读取方之间需要进行互斥。如果这几种场景下使用同一种锁就会产生极大的性能消耗,因此有了读写锁的产生。

1.线程对于数据的访问方式

一个线程对于数据的访问方式无非两种,读数据和写数据:

两个线程都是读一个数据,此时没有线程安全问题,并发的读取即可;

一个线程读数据一个线程写数据,有线程安全问题;

两个线程都是写数据,也有线程安全问题。

读写锁就是把读和写区别对待,

Java 标准库提供了 ReentrantReadWriteLock 类, 实现
了读写锁.
ReentrantReadWriteLock.ReadLock 类表⽰⼀个读锁. 这个对象提供了 lock / unlock ⽅法
进⾏加锁解锁.
ReentrantReadWriteLock.WriteLock 类表⽰⼀个写锁. 这个对象也提供了 lock / unlock
⽅法进⾏加锁解锁.
其中, 读加锁和读加锁之间, 不互斥. 写加锁和写加锁之间, 互斥. 读加锁和写加锁之间, 互斥.
Synchronized不是读写锁。

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

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

相关文章

基于SSM的农家乐管理系统+论文示例参考

1.项目介绍 功能模块:管理员(农家乐管理、美食信息管理、住宿信息管理、活动信息、用户管理、活动报名、论坛等),普通用户(注册登录、活动报名、客房预订、用户评价、收藏管理、模拟支付等)技术选型&#…

jmeter--CSV数据文件设置--请求体设置变量

目录 一、示例 1、准备组织列表的TXT文件,如下: 2、添加 CSV数据文件设置 ,如下: 3、接口请求体设置变量,如下: 二、CSV数据文件设置 1、CSV Data Set Config 配置选项说明 2、示例 CSV 文件内容 3、…

Redis环境部署(主从模式、哨兵模式、集群模式)

一、概述 REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库…

【大数据学习 | flume】flume之常见的sink组件

Flume Sink取出Channel中的数据,进行相应的存储文件系统,数据库,或者提交到远程服务器。Flume也提供了各种sink的实现,包括HDFS sink、Logger sink、Avro sink、File Roll sink、HBase sink,。 ​ Flume Sink在设置存…

【ArcGIS微课1000例】0127:计算城市之间的距离

本文讲述,在ArcGIS中,计算城市(以地级城市为例)之间的距离,效果如下图所示: 一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析…

(Linux 入门) 基本指令、基本权限

目录 一、什么是操作系统 二、基础指令 01. ls 指令 02. pwd命令 03.mkdir 04. touch指令 05.rmdir指令 && rm 指令 06.man指令(重要) 07 cat 08.cp指令 09 mv指令 10 alias 指令 11.more指令 12.head指令 13.less指令 14.时间相…

云原生之运维监控实践-使用Prometheus与Grafana实现对Nginx和Nacos服务的监测

背景 如果你要为应用程序构建规范或用户故事,那么务必先把应用程序每个组件的监控指标考虑进来,千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章,当…

QT基础 窗体 对话框 文件 QT5.12.3环境 C++实现

一、堆栈窗体 1. 概念 是一种界面设计思路, 多个窗体重叠在一起,通过点击对应的按钮,显示对应的界面。 2. 相关方法 Public FunctionsQStackedWidget(QWidget * parent 0)//stack如果单纯指定父窗口,但是没有指定大小&#xf…

【NOIP提高组】潜伏者

【NOIP提高组】潜伏者 💐The Begin💐点点关注,收藏不迷路💐 R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动。 历尽艰险后,潜伏于 S 国的R 国间谍小C 终于摸清了S 国…

共享门店模式:创新零售的新篇章

​在消费升级和数字化转型的双重浪潮下,传统零售业正面临前所未有的挑战与机遇。其中,共享门店模式作为一种创新的商业模式,正逐渐成为实体店铺应对电商冲击、提升运营效率和市场竞争力的重要途径。本文将深入解析共享门店模式的内涵、优势、…

除了电商平台,还有哪些网站适合进行数据爬取?

在数字化时代,数据的价值日益凸显,而网络爬虫技术成为获取数据的重要手段。除了电商平台,还有许多其他类型的网站适合进行数据爬取,以支持市场研究、数据分析、内容聚合等多种应用场景。本文将探讨除了电商平台外,还有…

STM32G4的数模转换器(DAC)的应用

目录 概述 1 DAC模块介绍 2 STM32Cube配置参数 2.1 参数配置 2.2 项目架构 3 代码实现 3.1 接口函数 3.2 功能函数 3.3 波形源代码 4 DAC功能测试 4.1 测试方法介绍 4.2 波形测试 概述 本文主要介绍如何使用STM32G4的DAC模块功能,笔者使用STM32Cube工具…

Linux-Apache

文章目录 Apache基础配置 🏡作者主页:点击! 🤖Linux专栏:点击! ⏰️创作时间:2024年11月19日12点20分 Apache Web服务器用来实现HTTP和相关TCP连接的处理,同时负责所提供资源的管理…

[JavaWeb] 尚硅谷JavaWeb课程笔记

1 Tomcat服务器 Tomcat目录结构 bin:该目录下存放的是二进制可执行文件,如果是安装版,那么这个目录下会有两个exe文件:tomcat10.exe、tomcat10w.exe,前者是在控制台下启动Tomcat,后者是弹出GUI窗口启动To…

集群聊天服务器(12)nginx负载均衡器

目录 负载均衡器nginx负载均衡器优势 如何解决集群聊天服务器跨服务器通信问题?nginx的TCP负载均衡配置nginx配置 负载均衡器 目前最多只能支持2w台客户机进行同时聊天 所以要引入集群,多服务器。 但是客户连哪一台服务器呢?客户并不知道哪一…

基于YOLOv8深度学习的智慧交通事故评级检测系统研究与实现(PyQt5界面+数据集+训练代码)

本文研究并实现了一种基于YOLOv8深度学习模型的智慧交通事故评级检测系统,旨在解决传统交通事故检测过程中效率低、误报率高等问题。该系统通过深度学习技术的应用,结合交通事故图像的分析,能够实现对事故的精准识别和评级,进而为…

基于Java Springboot出租车管理网站

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

iOS 18 导航栏插入动画会导致背景短暂变白的解决

问题现象 在最新的 iOS 18 系统中,如果我们执行导航栏的插入动画,可能会造成导航栏背景短暂地变为白色: 如上图所示:我们分别向主视图和 Sheet 弹出视图的导航栏插入了消息,并应用了动画效果。可以看到,前者的导航栏背景会在消息插入那一霎那“变白”,而后者则没有任何…

[Go]-sync.map使用详解

sync.Map是 Go 语言中在并发环境下使用的安全映射类型。 一、为什么需要sync.Map 在 Go 语言中,普通的map不是并发安全的。当多个 goroutine 同时读写一个普通map时,可能会导致程序出现未定义的行为,比如数据竞争、程序崩溃等。而sync.Map则…

Ubuntu22.04安装CH343驱动并创建udev规则

驱动说明 Linux系统提供CH34*系列 USB UART 设备配合使用的默认 CDC-ACM 驱动程序。驱动程序文件名为CDC-ACM。CDC-ACM 驱动程序控制特定设备的能力有限。此通用驱动程序不了解特定设备协议。因此,设备制造商可以创建能够访问设备特定功能集(例如硬件流…