ReentrantReadWriteLock、StampedLock

news2024/10/6 16:19:58

ReentrantLock、ReentrantReadWriteLock、StampedLock

读写锁

一个资源可以被多个读线程访问,或者被一个写线程访问,但是不能同时存在读写线程。

小口诀:读写互斥,读读共享

锁的演变

无锁-----> 独占锁----->读写锁----->邮戳锁

请添加图片描述

ReentrantReadWriteLock读写锁

ReentrantReadWriteLock读写锁并不是真正意义上的读写分离,它只允许读读共存,读写和写写依然是互斥的

使用场景:读多写少的情况下适合使用读写锁

缺点

1.锁饥饿:一直都是读线程获得锁,写线程抢不到锁

2.锁降级:遵循获取写锁----->再获取读锁----->再释放写锁的次序,写锁能够降级成为读锁

如果一个线程占有写锁,在不释放写锁的情况下,它还能占有读锁,即写锁降级为读锁

写锁降级读锁可以,读锁降级到写锁不可以

代码证明

请添加图片描述
请添加图片描述

结果也证实,在获取写锁后不需要释放写锁就可以直接获取读锁,也就是锁降级

接下来证明相反情况,读锁到写锁,先说结论读锁到写锁需要先释放读锁才能获取到写锁
请添加图片描述

请添加图片描述

小问题

为什么需要锁降级,也就是为什么获取写锁还可以获取读锁,这样做的意义是什么?

答:写后立即可以读,在高并发情况下,很可能有多个写操作将资源修改,造成数据紊乱,锁降级可以在写锁内再获取读锁,由于读写互斥,所以其他写操作必须等到读锁释放才能获取写锁。

由此可以知道读写锁会导致锁饥饿,为解决该问题,邮戳锁提出解决方案

StampedLock 邮戳锁

特点

1.所有获取锁的方法,都返回一个邮戳(Stamp),Stamp为零表示获取失败,其余表示成功

2.所有释放锁的方法,都需要一个邮戳(Stamp),这个Stamp必须是和成功获取锁时得到的Stamp一致

3.StampLock是不可重入的(如果一个线程已经持有写锁,再去获取写锁就会造成死锁)

StampLock的三种访问模式

1.Reading(读模式):功能与ReentrantReadWriteLock的读锁类似

2.Writing(写模式):功能和ReentrantReadWriteLock的写锁类似

3.Optimistic reading(乐观读模式):无锁机制,类似数据库中的乐观锁,支持读写并发,很乐观的认为读取时没人修改,假如被修改再实现锁升级为悲观读模式

缺点:(工作中不要用)

1.StampLock不支持重入

2.StampLock的悲观读锁和写锁都不支持条件变量(Condition)

3.使用StampLock不要调用interrupt()方法

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

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

相关文章

为什么各个企业都在创建FAQ、常见问题页面?

常见问题解答页面是您可能已经为您的公司考虑过的东西,作为帮助客户回答有关您的产品和服务的常见问题的一种方式。但是您不知道最好的方法;肯定这只是一个问题清单吗?常见问题解答在整个购买过程中为客户提供支持,并减少客户需要与贵公司的联…

服务异步通信 RabbitMQ-高级篇

服务异步通信RabbitMQ-高级篇服务异步通信RabbitMQ-高级篇1.消息可靠性1.1.生产者消息确认1.1.1.修改配置1.1.2.定义Return回调1.1.3.定义ConfirmCallback1.2.消息持久化1.2.1.交换机持久化1.2.2.队列持久化1.2.3.消息持久化1.3.消费者消息确认1.3.1.演示none模式1.3.2.演示aut…

Spring Data JPA和MyBatisPlus比较以及SpringBoot整合

文章目录一.基本概念二.SpringBoot JPA整合hibernate -yml配置三.SpringBoot整合MyBatisPlus一.基本概念 Spring Data JPA作用:面向对象的ORM全自动化框架,简化持久化操作的开发工作:让开发者从繁琐的JDBC和SQL代码中解脱出来,直接面向对象持久化操作.特点:跨数据库…

Elasticsearch:在搜索中使用衰减函数(Gauss)

在我之前的文章 “Elasticsearch:使用 function_score 及 script_score 定制搜索结果的分数” 我有讲到 Decay 函数在搜索中的使用。在那里,我有一个例子讲述在规定的时间里,分数不进行衰减。同一的函数也可以适用于地理位置的搜索。位置搜索…

C++原子变量atomic详解

C原子变量atomic详解一、简介二、成员函数2.1、构造函数2.2、is_lock_free函数2.3、store函数2.4、load函数2.5、exchange函数2.6、compare_exchange_weak函数2.7、compare_exchange_strong函数2.8、专业化支持的操作三、使用示例总结一、简介 原子类型的对象包含特定type ()的…

分享5个超好用的Vue.js库

开发人员最好的朋友和救星就是这些第三方库,无论是开发新手还是经验丰富的老手,我们都喜欢开源软件包。借助开源库加速Vue项目的开发进度是现代前端开发比较常见的方式,这几个 Vue.js库,建议尽早用上,加速你的项目开发…

集合(Set、Collections、Map、集合嵌套)

目录 Set系列集合 Set系列集合概述 HashSet元素无序的底层原理:哈希表 HashSet元素去重复的底层原理 实现类:LinkedHashSet 实现类:TreeSet Collection体系的特点、使用场景总结 补充知识:可变参数 补充知识:集…

自动化测试实战篇(7)jmeter连接mysql数据库,实现单表、多表、三表查询,并对表中数据进行修改,删除,新增操作

Jmeter也可以连接mysql数据库,通过JDBC去调用数据库内的参数到HTTP请求中进行接口测试,可以说是相当方便 自动化测试实战篇(7)jmeter连接mysql数据库,实现单表、多表、三表查询,并对表中数据进行修改&#…

多线程带来的的风险-线程安全

❣️关注专栏:: JavaEE 这篇文章将为大家描述线程安全问题的原因和解决方案。线程安全是多线程编程中最难的地方,也是重要的地方,还是一个最容易出错的地方,也是面试中容易考的要点,同样也是我们以后工作中经常爱出错的…

【软件测试】8年资深测试总结出的测试学习经验,从入门到测试开发......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 测试圈子里有一句话…

Python语言零基础入门教程(九)

Python pass 语句 Python pass 是空语句,是为了保持程序结构的完整性。 pass 不做任何事情,一般用做占位语句。 Python 语言 pass 语句语法格式如下: pass测试实例: #!/usr/bin/python # -*- coding: UTF-8 -*- # 输出 Pytho…

Caused by: java.sql.SQLException: ORA-28040: 没有匹配的验证协议

更改Oracle的配置文件:Oracle -> app -> ... ->...dbhome... -> admin重启Oracle:重启Oracle数据库的操作步骤1.查看监听器状态:lsnrctl status2.停止监听器:lsnrctl stop3.连接数据库:sqlplus / as sysdba4.停止数据…

怡合达业务大规模容器化最佳实践

作者:肖念康,东莞怡合达智能制造供应链资深 Java 开发工程师,主要负责公司内部 DevOps、代码托管平台、任务需求管理平台的研发及其他项目的管理,云原生的研究与开发工作。 公司简介 怡合达致力于自动化零部件研发、生产和销售&am…

[C++] -- 模板初阶

文章目录函数模板函数模板的隐式实例化显式实例化模板参数的匹配原则类模板模板函数声明和定义分离会链接错误函数模板 对于一些参数不同但功能类似的函数,C有函数重载,但是函数重载有一些缺陷: 重载的函数只是参数不同,代码复用…

【五六七人口普查】我国省市两级家庭户住房状况

人口数据是我们在各项研究中最常使用的数据!之前我们分享过第七次人口普查(简称七普)的数据!很多小伙伴拿到数据后都反馈数据非常好用,同时很多小伙伴咨询有没有前面几次人口普查的数据,这样方便做人口变化…

7.1 微服务-SpringCloud(二)

目录 前言 7.1.5 Hystrix 7.1.5.1 什么是Hystrix 7.1.5.2 雪崩问题 7.1.5.3 线程隔离,服务降级 7.1.5.4 搭建 7.1.5.4.1 引入依赖 7.1.5.4.2 开启熔断 7.1.5.4.3 编写降级逻辑 1.局部降级逻辑 2.全局降级逻辑 7.1.5.4.4 设置超时 7.1.5.5 服务熔断 7.…

2023-02-09 - 1 Elasticsearch简介

1 Elasticsearch的基本概念 1.1 索引 在使用传统的关系型数据库时,如果对数据有存取和更新操作,需要建立一个数据库。相应地,在ES中则需要建立索引。用户的数据新增、搜索和更新等操作的对象全部对应索引。 1.2 文档 在使用传统的关系型数…

上海亚商投顾:三大指数均涨超1% 芯片板块集体大涨

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。市场情绪三大指数今日低开高走,午后集体涨超1%,创业板指盘中涨超1.7%。芯片板块集体大涨,…

Node——使用nvm切换node版本

1. 下载mvn安装包 https://pan.baidu.com/s/1alfyRvwVWr_TrkN0A9Er5g?pwd1v7c 2. 安装后命令输入mvn -v 验证是否安装成功 3. mvn命令 nvm list available 显示可下载的版本nvm install [node版本号] 显示可下载的版本nvm uninstall [node版本号] 删除已安装的指定版本nvm…

内网资源探测

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :内网安全 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是…