【并发编程篇】读锁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()获取读锁,允许多个线程同时读取数据。
这种读写锁的机制可以提高并发性能,因为允许多个线程同时读取共享资源,而不会产生数据冲突,同时通过只允许一个线程写入共享资源,可以避免写操作的数据竞争和不一致性。

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

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis哨兵+redis主从复制(在虚拟机centos的docker下)

1.安装docker Docker安装(CentOS)简单使用-CSDN博客 2.redis主从复制 redis主从复制(在虚拟机centos的docker下)-CSDN博客 3.编辑3个redis配置 cd /etc mkdir redis-sentinel cd redis-sentinel/ wget http://download.redis.io/redis-stable/sentinel.confcp sentinel.co…

分享一款适合小白制作企业期刊的网站

随着互联网的普及&#xff0c;越来越多的企业开始意识到在线内容的重要性。而制作企业期刊&#xff0c;不仅能提升企业的品牌形象&#xff0c;还能增强与客户的互动。然而&#xff0c;对于许多初入行的企业来说&#xff0c;制作期刊似乎是一项艰巨的任务。 给大家分享一款适合小…

第十四章 集合(Set)

一、Set 接口&#xff08;P518&#xff09; 1. Set 接口基本介绍 &#xff08;1&#xff09;无序&#xff08;添加和取出的顺序不一致&#xff09;&#xff0c;没有索引。 &#xff08;2&#xff09;不允许重复元素&#xff0c;所以最多包含一个 null。 2. Set 接口的常用方法…

Object常用方法讲解(附带使用示例)

1. 参考 Java基础教程之Object类&#xff0c;Object类干货详解 wait、notify、notifyAll的理解与使用 2. 实战 clone()方法 对象 clone 方法默认是浅拷贝&#xff0c;深拷贝需要重写clone方法。 浅拷贝&#xff1a;拷贝出来的对象&#xff0c;如果部分属性是引用类型&#…

Node.js精品课程网站27724-计算机毕业设计项目选题推荐(免费领源码)

目 录 摘要 1 绪论 1.1研究背景 1.2研究现状及意义 1.3koa框架 1.4论文结构与章节安排 2精品课程网站系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.3.2数据修改流程 2.3.3数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析…

SpringBoot集成RabbitMq消息队列【附源码】

1. 项目背景 要啥项目背景&#xff0c;就是干&#xff01;&#xff01;&#xff01; SpringBoot版本&#xff1a;2.7.12 2. Rabbit MQ安装 这里讲解使用docker安装RabbitMQ&#xff0c;如果在windows下面安装RabbitMQ&#xff0c;参考下文 【笑小枫的按步照搬系列】Window…

第十七节TypeScript 对象

1、TypeScript对象是包含一组键值对的实例。值可以是标量、函数、数组、对象等&#xff0c;如下实例&#xff1a; var object_name { key1: "value1", // 标量key2: "value", key3: function() {// 函数}, key4:["content1", "content2&…

Python 数据分析 Matplotlib篇 plt.rcParams 字典(第5讲)

Python 数据分析 Matplotlib篇 plt.rcParams字典(第5讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

elasticsearch-安装IK分词器

一、el默认分词器 es在创建倒排索引时需要对文档分词&#xff0c;在搜索时&#xff0c;需要对用户输入内容分词。但默认的分词规则对中文处理并不友好&#xff0c;在kibana的DevTools中测试 二、IK分词器 处理中文分词&#xff0c;一般会使用IK分词器。 GitHub官方网址&…

AIRLOOK数字技术赋能水利建设,让治水走向“智水”

山有百藏而不言&#xff0c;水润万物而不语。中国属于大河文明&#xff0c;农业历来在经济中占主导地位&#xff0c;其中水利灌溉是保证农业生产和提高农业产量的重要因素。如今&#xff0c;传统水利通过与数字孪生相结合&#xff0c;通过数据可视可控&#xff0c;做到水利“四…

对STM32 DMA突发传输的理解

每个数据流都独立拥有四级 32 位 FIFO(先进先出存储器缓冲区)&#xff0c; 即FIFO大小为 4 * 4字节 16字节 节拍 MSIZE&#xff0c;当MSIZE为字节时&#xff0c;4个节拍的一次突发即一次性发送4个字节&#xff1b; 同理&#xff0c;当MSIZE为半字时&#xff0c;4个节拍的一次…

K8S 日志方案

目录 一、统一日志管理的整体方案 1、基础日志 2、Node级别的日志 3、集群级别的日志架构 二、安装统一日志管理组件 1、 部署Elasticsearch 2、部署Fluentd 3、部署Kibana 三、日志数据展示 一、统一日志管理的整体方案 通过应用和系统日志可以了解Kubernetes集群内…

【JVM】虚拟机的组成+字节码文件组成+类的生命周期

什么是JVM&#xff1f; JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 JVM的功能 1.解释和运行&#xff1a;对字节码文件中的指令实时的解释成机器码让计算机执行。 2.内存管理&#xff1a;自动为对象、方法等分配内存&#xff0c;自动…

强大的Adobe全家桶软件都是干什么用的,你知道吗?

Adobe Creative Suite是Adobe系统公司出品的一个图形设计、影像编辑与网络开发的软件产品套装。该套装的最高版本是Adobe Creative Cloud。 根据受众市场的不同分为Master Collection(大师版)、Production Premium&#xff08;影音高级版&#xff09;Design&Web Premium&a…

【办公技巧】ppt如何加密只能看不能修改?

大家是否想要给PPT文件设置加密&#xff0c;让ppt文件变为只能查看不能修改的状态&#xff1f;今天给大家分享给PPT文件设置带有密码的只读模式&#xff08;修改权限&#xff09;。 方法如下&#xff1a; PPT文件之后&#xff0c;将PPT文件进行另存为操作&#xff0c;但是在选…

【OAuth2】授权框架的四种授权方式详解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《OAuth 2》。&#x1f3af;&#x1f3af; &#x1…

Java_Stream流

一、JDK8新特性&#xff08;Stream流&#xff09; 接下来学习一个全新的知识&#xff0c;叫做Stream流&#xff08;也叫Stream API&#xff09;。它是从JDK8以后才有的一个新特性&#xff0c;是专业用于对集合或者数组进行便捷操作的。有多方便呢&#xff1f;我们用一个案例体…

从物联网到 3D 打印:硬件相关的开源项目概览 | 开源专题 No.52

arendst/Tasmota Stars: 20.4k License: GPL-3.0 Tasmota 是一款为 ESP8266 和 ESP32 设备提供的替代固件&#xff0c;具有易于配置的 webUI、OTA 更新、定时器或规则驱动的自动化功能以及通过 MQTT、HTTP、串口或 KNX 进行完全本地控制。该项目主要特点包括&#xff1a; 支持…

赛宁综合安全验证评估,筑牢关基网络安全屏障

在国际复杂态势和数字经济发展的驱动下&#xff0c;关键信息基础设施&#xff08;以下简称&#xff1a;关基&#xff09;的安全运营逐步走向实战化、体系化和常态化。验证评估作为安全运营的试金石&#xff0c;已成为实现动态防御、主动防御的有力手段。如何通过体系化验证评估…

太牛叉了!国产 AI 智能体惊艳问世,全面致敬 FastGPT!

太震撼了&#xff01;太厉害了&#xff01;昆仑万维正式发布了「天工 SkyAgents」平台&#xff0c;助力大模型走入千家万户。你听听&#xff0c;这个名字一听就有一种巧夺天工的感觉&#xff0c;技艺那是相当的高超。 这个平台基于昆仑万维「天工大模型」打造&#xff0c;具备…