【JUC并发编程】读写锁:ReadWriteLock

news2024/9/20 1:03:32

一、介绍

在这里插入图片描述

二、代码演示

1. 不使用读写锁

package readwritelock;

import java.util.HashMap;
import java.util.Map;

/**
 * @author swaggyhang
 * @create 2023-07-09 11:16
 */
public class Test01 {
    public static void main(String[] args) {
        MyCache myCache = new MyCache();

        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 MyCache {

    private volatile Map<String, Object> map = new HashMap<>();

    // 存入
    public void put(String key, Object value) {
        System.out.println("线程" + Thread.currentThread().getName() + ":写入 => " + key);
        map.put(key, value);
        System.out.println("线程" + Thread.currentThread().getName() + ":写入OK ");
    }

    // 取出
    public void get(String key) {
        System.out.println("线程" + Thread.currentThread().getName() + ":取出 => " + key);
        Object o = map.get(key);
        System.out.println("线程" + Thread.currentThread().getName() + ":取出OK");
    }
}

2. 使用读写锁

package readwritelock;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @author swaggyhang
 * @create 2023-07-09 11:27
 */
public class Test02 {
    public static void main(String[] args) {
        MyCacheLock myCacheLock = new MyCacheLock();

        for (int i = 1; i <= 5; i++) {
            final int temp = i;
            new Thread(() -> {
                myCacheLock.put(temp + "", temp);
            }, String.valueOf(i)).start();
        }

        for (int i = 1; i <= 5; i++) {
            final int temp = i;
            new Thread(() -> {
                myCacheLock.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() + ":写入OK ");
        } 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() + ":取出OK");
        } finally {
            readWriteLock.readLock().unlock();
        }
    }
}

三、总结

  • ReadWriteLock读写锁特点
    ① 写锁是独占锁,一次只能被一个线程占有
    ② 读锁是共享锁,多个线程可以同时占有

  • 读-读:可以共存

  • 读-写:不能共存

  • 写-写:不能共存

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

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

相关文章

功夫这个词,西方语言中没有

功夫这个词&#xff0c;西方语言中没有 功夫一种意思是武侠片的武功之意 另一种意思就是【下功夫】 趣讲大白话&#xff1a;只要功夫深&#xff0c;铁棒磨成针 【趣讲信息科技220期】 #非著名IT人安志强的趣味笔记# **************************** 西方词语怎么翻译功夫的&#…

EtherNet/IP转CAN网关can协议分为几种

生产管理设备中&#xff0c;会有设备与其他设备的协议不同&#xff0c;数据无法互通&#xff0c;让你的工作陷入困境。这时&#xff0c;一款神奇的产品出现了——远创智控YC-EIP-CAN通讯网关&#xff01; 1, 这款通讯网关采用ETHERNET/IP从站功能&#xff0c;可以将各种CAN总…

什么事RPC并实现一个简单的RPC

1. 基本的RPC模型 主要介绍RPC是什么&#xff0c;基本的RPC代码&#xff0c;RPC与REST的区别&#xff0c;gRPC的使用 1.1 基本概念 RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;简单的理解是一个节点请求另一个节点提供的服务本地过程调用&am…

管理类联考——逻辑——技巧篇——数字编码——公式

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

特斯拉12V低压系统存在问题:刹车失灵还能怪司机吗?

特斯拉汽车失控加速事件引发全球关注&#xff0c;美国NHTSA&#xff08;交通运输安全委员会&#xff09;和特斯拉之前将责任归咎于司机误操作。但一位研究人员提出新解释&#xff0c;并指出特斯拉的12V低压系统可能存在问题&#xff0c;特别是在高负载状态下。 此研究认为&…

git上传文件到Gitee报错“error: failed to push some refs to https://gitee.com/xxxx”

文章目录 前言一、创建项目仓库二、创建工作区三、配置 LFS四、上传镜像文件 前言 我要将一个 4.27 GB 的文件上传到 Gitee 上&#xff0c;但是出现了下面这样的报错 error: failed to push some refs to https://gitee.com/xxxx/centos.git 因此记录一下解决报错的方法。 一、…

基于粤嵌gec6818开发板嵌入式开发电子相册,音乐播放,视频播放,2048游戏

一、功能与要求 实现功能&#xff1a;本系统需要使用粤嵌的GEC-6818开发板设计一款娱乐影音系统&#xff0c;其中包括图片显示&#xff08;相册&#xff09;、音乐播放、视频播放&#xff0c;游戏四个部分&#xff0c;在每个部分内部&#xff0c;具有操控各个部分的功能触摸按…

UNIAPP调用讯飞语音评测API

1、历经千辛万苦&#xff0c;UNIAPP调用评测API终于完成&#xff0c;在此做下总结下&#xff1a;首先看效果&#xff01; 2、实现第1步&#xff0c;首先是鉴权&#xff0c;用到的CryptoJS等工具都可以从讯飞和uniapp官方获取 import * as base64 from "base-64" impo…

redis操作问题

使用redisTemplate 往set集合中批量添加值 # 第一种办法就是for循环&#xff0c;每次进行setfor (int i 0; i < 1000000; i) {redisTemplate.opsForSet().add("key",i);} # 第二中办法就是使用HashSet批量添加数据Set set new HashSet<>();for (int i 1…

mybatisplus生成代码

导包&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>m…

CorelDRAW2023免费版平面设计矢量绘图工具

最初CorelDRAW 被开发运行于Windows版&#xff0c;数年后Macintosh版也随之发布。同时&#xff0c;CorelDRAW曾经存在过Linux的版本&#xff0c;但后来被放弃了。CorelDRAW简称cdr&#xff0c;是一款功能强大的矢量图制作软件&#xff0c;一说到矢量图制作&#xff0c;大家都会…

Go实现socks5服务器

SOCKS5 是一个代理协议&#xff0c;它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色&#xff0c;使得内部网中的前端机器变得能够访问Internet网中的服务器&#xff0c;或者使通讯更加安全。SOCKS5 服务器通过将前端发来的请求转发给真正的目标服务器&#…

应用层:万维网WWW

1.万维网WWW 笔记来源&#xff1a; 湖科大教书匠&#xff1a;应用层概述 湖科大教书匠&#xff1a;万维网WWW 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 浏览器最重要的部分是渲染引擎&#xff0c;也就是浏览器内核。负责对网页内容进行解析和…

【触类旁通】编写代码和写小说的相似性

【触类旁通】编写代码和写小说的相似性 1&#xff0c;序2&#xff0c;对比分析2.1 相同点2.1.1 三要素2.1.2 读者-用户&#xff08;受众&#xff09;2.1.3 目录——功能模块2.1.4 故事情节——框架2.1.5 文笔——编程风格2.1.6 多部作品——多个阶段2.1.7 修辞——设计模式2.1.…

Mycat【Mycat分片规则(取模、分片枚举、范围约定)】(六)-全面详解(学习总结---从入门到深化)

目录 Mycat分片规则_取模 Mycat分片规则_分片枚举 Mycat分片规则_范围约定 Mycat分片规则_取模 实现方式 取模分片就是根据数据表的某一个字段&#xff0c;通常是某一个整数型的字 段&#xff0c;对其进行十进制的求模运算&#xff0c;将运算结果作为Mycat的路由结果。 注…

Element-案例-脚本页面布局

案例需求&#xff1a; 根据页面原型完成员工管理页面开发&#xff0c;并通过Axios完成数据异步加载 步骤 创建页面&#xff0c;完成页面的总体布局规划布局中各个组件的实现列表数据的异步加载&#xff0c;并渲染展示 1.创建页面&#xff0c;完成页面的总体布局规划 分析案…

代码随想录算法训练营第十三天 | 二叉树系列4

二叉树系列4 617 合并二叉树重点代码随想录的代码我的代码(晚上理解后自己编写) 700 二叉搜索树中的搜索未看解答自己编写看了解答后&#xff0c;精简了两个判断的写法重点代码随想录的代码我的代码(晚上理解后自己编写) 98 验证二叉搜索树重点看到二叉搜索树&#xff0c;就要想…

rust 自动化测试、迭代器与闭包、智能指针、无畏并发

编写测试可以让我们的代码在后续迭代过程中不出现功能性缺陷问题&#xff1b;理解迭代器、闭包的函数式编程特性&#xff1b;Box<T>智能指针在堆上存储数据&#xff0c;Rc<T>智能指针开启多所有权模式等&#xff1b;理解并发&#xff0c;如何安全的使用线程&#x…

静态路由实验

目录 第一步&#xff1a; 第二步&#xff1a; 端口IP配置方法 环回接口IP配置方法 第三步&#xff1a; 第四步&#xff1a; 第一步&#xff1a; 先进行子网划分 192.168.1.0 24 子网划分 需要13个广播域 5个网段——子网划分 192.168.1.0 24 192.168.1.000 00000 27 192.…

数据结构一:绪论

一、绪论 数据结构是计算机科学中的一门基础课程&#xff0c;研究数据的存储、组织和管理方法&#xff0c;以及在这些数据上进行各种操作的算法和技术。掌握数据结构和算法是编程中非常重要的基础&#xff0c;对于实现高效、可靠的程序至关重要。常见的数据结构包括数组、链表、…