【并发编程篇】读锁readLock()和写锁writeLock()

文章目录

  • 🛸情景引入
    • ⭐解决问题

在这里插入图片描述
readLock()和writeLock()都是ReadWriteLock接口中定义的方法,用于获取读锁和写锁。

readLock()方法返回一个读锁,允许多个线程同时获取该锁,以进行并发读取操作。如果当前已有一个写锁或其他线程正在请求写锁,则读锁会被阻塞,直到所有写锁请求完成并释放锁为止。读锁和写锁之间是互斥的。

writeLock()方法返回一个写锁,只允许一个线程获取该锁,以进行写入操作。如果当前已有一个读锁或其他线程正在请求读锁,则写锁会被阻塞,直到所有读锁请求完成并释放锁为止。写锁是独占的,同一时间只能有一个线程持有写锁。

在使用读写锁时,应该根据具体的业务场景和需求选择适当的锁类型。如果共享资源的读取操作远远超过写入操作,那么使用读写锁可以提高系统的并发性能。如果写入操作非常频繁,那么使用读写锁可能会导致读取操作的性能下降,因为读取线程需要等待写入线程释放写锁。此外,读写锁也需要消耗额外的系统资源,因此应该避免不必要的锁竞争。

🛸情景引入

我们先看下面这段代码
在这里插入图片描述

本来应该是1写入,然后1写入完全
但是现在1写入后,紧跟着的是3写入
这明显是错误的

⭐解决问题

下面我们来加上锁,解决问题

package org.Test6;import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteLockDemo {public static void main(String[] args) {MyCacheLock myCache = new MyCacheLock();//写入for(int i=1;i<=5;i++){final int temp=i;new Thread(()->{myCache.put(temp+"",temp+"");},String.valueOf(i)).start();}//读取for(int i=1;i<=5;i++){final int temp=i;new Thread(()->{myCache.get(temp+"");},String.valueOf(i)).start();}}
}//自定义缓存
class MyCacheLock{private volatile Map<String,Object> map = new HashMap<>();private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();//存 写 写入的时候// 只希望只有一个线程去写public void put(String key,Object value){readWriteLock.writeLock().lock();  //加锁try {System.out.println(Thread.currentThread().getName()+"写入"+key);map.put("key","value");System.out.println(Thread.currentThread().getName()+"写入结束");} catch (Exception e) {e.printStackTrace();}finally {readWriteLock.writeLock().unlock();  //解锁}}//取 读//读的时候,所有人都可以读public void get(String key){readWriteLock.readLock().lock(); //加锁try {System.out.println(Thread.currentThread().getName()+"读取"+key);Object o=map.get("key");System.out.println(Thread.currentThread().getName()+"读取结束");} catch (Exception e) {e.printStackTrace();}finally {readWriteLock.readLock().unlock(); //解锁}}
}

在这里插入图片描述

这段代码中,读操作和写操作的主要区别在于使用的锁不同,读操作使用ReadWriteLock实例中的readLock()获取读锁,而写操作使用writeLock()获取写锁。
读写锁允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。因此,在读操作中,多个线程可以同时获得读锁并读取共享资源,而写操作需要获取排他的写锁,以防止其他线程同时写入共享资源。
在MyCacheLock中,put()方法使用writeLock()获取写锁,以确保只有一个线程在写入数据时修改共享资源,而get()方法使用readLock()获取读锁,允许多个线程同时读取数据。
这种读写锁的机制可以提高并发性能,因为允许多个线程同时读取共享资源,而不会产生数据冲突,同时通过只允许一个线程写入共享资源,可以避免写操作的数据竞争和不一致性。

独占锁(写锁):一次只能被一个线程占有
共享锁(读锁):多个线程可以同时占有

在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!

在这里插入图片描述

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

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

相关文章

GIT具体配置步骤详解

GIT配置具体步骤如下 SDK 使用 Repo 工具管理&#xff0c;拉取 SDK 需要配置安装 Repo 工具。 Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workf…

装饰器模式和责任链模式区别

近期看了 mybatis 的源码&#xff0c;发现二级缓存这块用了装饰器模式将各个功能的缓存进行嵌套&#xff0c;源码上也是讲到使用了装饰器模式&#xff0c;但是看着跟责任链模式类似&#xff0c;本着搞清楚的想法&#xff0c;搜了很多资料&#xff0c;看了书籍《Head First 设计…

AI行业新趋势:百模大战中的变革与未来

AI行业新趋势&#xff1a;百模大战中的变革与未来 人工智能&#xff0c;这个曾经被视为科幻小说的情节&#xff0c;如今已经成为我们生活中的常态。从智能手机、自动驾驶汽车&#xff0c;到智能家居、医疗诊断&#xff0c;AI的应用已经深入到我们生活的各个角落。然而&#xf…

多维时序 | MATLAB实CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测预测效果基本介…

ubuntu 22.04 安装mysql服务

完整内容&#xff1a; https://developer.aliyun.com/article/1260321 # 安装服务 sudo apt install mysql-server# 按向导设置root密码 sudo mysql_secure_installation# 使用设置的密码登录 sudo mysql -u root -p也可以使用工具登录&#xff0c;例如: navicat for mysql

协同工作php,PHPOA:灵活、高效、协同,让企业高效运转

原标题&#xff1a;PHPOA&#xff1a;灵活、高效、协同&#xff0c;让企业高效运转PHPOA系统作为一个管理系统&#xff0c;它的职责就是为企业高效运转而服务&#xff0c;以提高企业的办公效率为己任&#xff0c;减少不必要的资源浪费为责任。它保持高度的灵活性、高效性与协同…

ubuntu搭建php开发环境记录

2019独角兽企业重金招聘Python工程师标准>>> 这两天自己在阿里云上面买了一个ecs&#xff0c;系统选的是ubuntu16.04&#xff0c;第一件事就是先搭环境&#xff0c;这次准备使用lamp组合。 Apache安装 首先安装apache服务器&#xff0c;ubuntu下面使用apt-get来下载…

php datediff 函数,dateAdd与DateDiff函数的js代码

1、DateAdd函数&#xff1a;复制代码 代码示例:function DateAdd(interval,number,date){switch(interval.toLowerCase()){case "y": return new Date(date.setFullYear(date.getFullYear()number));case "m": return new Date(date.setMonth(date.getMont…

mysql索引为啥要选择B+树 (下)

有读者在 mysql索引为啥要选择B树 (上) 上篇文章中留言总结了选择 B 树的原因&#xff0c;大体上说对了&#xff0c;今天我们再一起来看看具体的原因。 索引为什么要保存在硬盘中首先要明白几个概念&#xff0c;服务器存储一般分内存和硬盘&#xff0c;内存的大小相对于硬盘来说…

des加解密java c#,C#编写DES加密、解密类

这个C#类封装的DES加密解密&#xff0c;可以使用默认秘钥进行加密、解密&#xff0c;也可以自定义秘钥进行加密、解密&#xff0c;调用简单方便。示例一&#xff1a;using System;using System.Security.Cryptography;using System.Text;namespace DotNet.Utilities{/// /// DE…

八年开发程序员浅析SpringBoot 之 Shiro 与 Redis 多级缓存问题

前言 来自不愿意透露姓名的小师弟的投稿。这篇主要讲了&#xff0c;项目中配置了多缓存遇到的坑&#xff0c;以及解决办法。 发现问题 在一次项目实践中有实现多级缓存其中有已经包括了 Shiro 的 Cache &#xff0c;本以为开启 redis 的缓存是一件很简单的事情只需要在启动类上…

Web端H.265播放器研发解密

音视频编解码对于前端工程师是一个比较少涉足的领域&#xff0c;涉及到流媒体技术中的文本、图形、图像、音频和视频多种理论知识的学习&#xff0c;才能够应用到具体实践中&#xff0c;本团队在多媒体领域深耕两年多&#xff0c;才算是有一定产出&#xff0c;我们自研web播放器…

拳击 武术java父类,拳击是一种很有力量的武术类型

原标题&#xff1a;拳击是一种很有力量的武术类型拳击是一种很有力量的武术类型&#xff0c;拳击比赛策略有很多&#xff0c;围绳技术是其中之一。那么拳击比赛策略技巧有哪些呢&#xff1f;下面养生之道网为您解析拳击比赛策略技巧有哪些&#xff0c;看看吧。1、当拳手靠在围绳…

捧上天的AI落地困难,“ 不懂变通”的华为云如何应付?

前几年&#xff0c;AI几乎被捧上天&#xff0c;各大公司倾巢出动&#xff0c;推出了不少吸眼球的应用和产品。如今&#xff0c;这些AI成果是否真得让企业从中获得价值&#xff1f;绕不开的数据、隐私和安全问题作何解&#xff1f;不同领域、不同规模、不同技术能力的企业如何最…

Apache-Flink深度解析-DataStream-Connectors之Kafka

Kafka 简介Apache Kafka是一个分布式发布-订阅消息传递系统。 它最初由LinkedIn公司开发&#xff0c;LinkedIn于2010年贡献给了Apache基金会并成为顶级开源项目。Kafka用于构建实时数据管道和流式应用程序。它具有水平扩展性、容错性、极快的速度&#xff0c;目前也得到了广泛的…

Java使用继承的语法是,Java基础语法八 继承

1、超类和子类超类和子类父类与子类多态&#xff1a;一个对象变量可以指示多种实际类型的现象称为多态一个变量可以引用父类对象&#xff0c;也可以引用其子类对象&#xff0c;这就是多态。不能将一个超类的引用赋给子类变量&#xff0c;因为调用子类方法时可能发生运行错误子类…

kaka 1.0.0 重磅发布,服务于后端的事件领域模型框架。

百度智能云 云生态狂欢季 热门云产品1折起>>> kaka 1.0.0正式发布了&#xff0c;从三个月前的kaka-notice-lib 1.0.0的发布&#xff0c;经过多次研磨&#xff0c;终于迎来了本次重大更新。 kaka是一款服务于java后端的事件领域模型框架&#xff0c;主要目的为解耦业…

java配置文件工具类,java项目加载配置文件的工具类

java项目加载配置文件的工具类package com.loadproperties;import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class ConfigUtil {private static InputStream input;private volatile Properties configuration new Properties();/…

如何把WAV格式音频转换为MP3格式

WAV为微软公司&#xff08;Microsoft)开发的一种声音文件格式&#xff0c;它符合RIFF(Resource Interchange File Format)文件规范&#xff0c;用于保存Windows平台的音频信息资源&#xff0c;被Windows平台及其应用程序所广泛支持&#xff0c;因此在声音文件质量和CD相差无几&…

php 异步处理类,php异步处理类

该类可以请求HTTP和HTTPS协议&#xff0c;还可以处理301、302重定向以及GZIP压缩等。[PHP]代码//使用方法require(asynHandle.class.php);$obj new asynHandle();$result $obj->Request(http://baidu.com);$result2 $obj->Get(https://mail.google.com/);echo "{…