并发编程之读写锁ReadWriteLock的详细解析(带小案例)

简介: 并发编程之读写锁ReadWriteLock的详细解析(带小案例)

读写锁ReadWriteLock

lock锁,只允许一个进程进行读/写

使用ReadWriteLock读写锁,可以实现控制:

  1. 多个线程同时读
  2. 同一时间只允许一个线程写

下面的demo展示的是,当多个线程要进行同时写操作时,没有加锁的情况,会导致多个线程并发写:

运行结果:

代码:

/**
 * @author zkw
 * @Description 读写锁
 */
public class ReadWriteLockDemo {
    public static void main(String[] args) {
        MyMap map = new MyMap();
        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                try {
                    map.put(Thread.currentThread().getName(),"");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },i+"").start();
        }
        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                try {
                    map.get(Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },i+"").start();
        }
    }
}
class MyMap{
    private HashMap<String,String> map = new HashMap<>();
    public void put(String key,String value) throws InterruptedException {
        System.out.println(Thread.currentThread().getName()+"开始写入");
        TimeUnit.SECONDS.sleep(1);
        map.put(key, value);
        System.out.println(Thread.currentThread().getName()+"写入完成");
    }
    public String get(String key) throws InterruptedException {
        System.out.println(Thread.currentThread().getName()+"开始读取");
        TimeUnit.SECONDS.sleep(1);
        String s = map.get(key);
        System.out.println(Thread.currentThread().getName()+"读取完成");
        return s;
    }
}

下面使用ReadWriteLock锁对上面的demo进行优化,禁止多个线程同时读的情况,并允许多个线程同时写:

运行结果:

代码:

/**
 * @author zkw
 * @Description 读写锁
 */
public class ReadWriteLockDemo {
    public static void main(String[] args) {
        MyMap map = new MyMap();
        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                try {
                    map.put(Thread.currentThread().getName(),"");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },i+"").start();
        }
        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                try {
                    map.get(Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },i+"").start();
        }
    }
}
class MyMap{
    private HashMap<String,String> map = new HashMap<>();
    ReadWriteLock readWriteLock = new ReentrantReadWriteLock();  //创建读写锁
    public void put(String key,String value) throws InterruptedException {
        readWriteLock.writeLock().lock(); //写锁
        System.out.println(Thread.currentThread().getName()+"开始写入");
        TimeUnit.SECONDS.sleep(1);
        map.put(key, value);
        System.out.println(Thread.currentThread().getName()+"写入完成");
        readWriteLock.writeLock().unlock();
    }
    public String get(String key) throws InterruptedException {
        readWriteLock.readLock().lock();  //读锁
        System.out.println(Thread.currentThread().getName()+"开始读取");
        TimeUnit.SECONDS.sleep(1);
        String s = map.get(key);
        System.out.println(Thread.currentThread().getName()+"读取完成");
        readWriteLock.readLock().unlock();
        return s;
    }
}


相关文章
|
机器学习/深度学习 自然语言处理 程序员
NLP:Transformer的简介(优缺点)、架构详解、案例应用之详细攻略
NLP:Transformer的简介(优缺点)、架构详解、案例应用之详细攻略
NLP:Transformer的简介(优缺点)、架构详解、案例应用之详细攻略
|
11月前
|
弹性计算 自然语言处理 安全
掌握 In-Context Learning (ICL):构建高效 Prompt 的技巧与调优策略
ICL(In-Context Learning)是一种在大型语言模型中使用的技术,通过提供示例让模型在上下文中理解任务并生成正确输出。核心步骤包括定义任务、选择和格式化示例、编写任务指示,并通过调优和修复错误提高模型性能。欢迎体验阿里云百炼大模型及相关服务产品。
399 1
|
12月前
|
前端开发 JavaScript 数据库
VSCode编程助手工程能力体验报告(一):通义灵码 - 帮你高效切入新项目、编码和提升质量
我是一位软件工程师,用通义灵码个人版vscode插件的workspace做项目分析和复盘,对比之前没有灵码,现在提效了80%,本文介绍了具体的使用流程。
2454 3
|
SQL Oracle 关系型数据库
Flink SQL 问题之看不到数据如何解决
Flink SQL报错通常指在使用Apache Flink的SQL接口执行数据处理任务时遇到的问题;本合集将收集常见的Flink SQL报错情况及其解决方法,帮助用户迅速恢复数据处理流程。
570 3
|
Linux
centos7升级内核到最新稳定版
centos7升级内核到最新稳定版
1851 0
|
定位技术
|
存储 安全 物联网
智能家居安全:物联网设备的漏洞与防护策略
【7月更文挑战第31天】随着物联网技术的飞速发展,智能家居设备已经渗透进千家万户。然而,随之而来的安全问题也日益凸显。本文将探讨智能家居设备中常见的安全漏洞,分析其成因,并提出有效的防护措施。通过案例分析和专家访谈,旨在为消费者和企业提供实用的安全防护建议。
306 0
|
算法 JavaScript
「AIGC算法」将word文档转换为纯文本
使用Node.js模块`mammoth`和`html-to-text`,该代码示例演示了如何将Word文档(.docx格式)转换为纯文本以适应AIGC的文本识别。流程包括将Word文档转化为HTML,然后进一步转换为纯文本,进行格式调整,并输出到控制台。转换过程中考虑了错误处理。提供的代码片段展示了具体的实现细节,包括关键库的导入和转换函数的调用。
285 0
|
编解码 前端开发 人机交互
Tkinter保姆级教程(上)(一)
Tkinter保姆级教程(上)
491 0
Tkinter保姆级教程(上)(一)
|
运维 Java BI
【Java】HIS医院信息化管理系统源码(SaaS模式多医院)
【Java】HIS医院信息化管理系统源码(SaaS模式多医院)
283 1