并发编程之读写锁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;
    }
}


相关文章
|
4月前
|
开发框架 .NET 中间件
.net8 使用 license 证书授权案例解析
本文介绍了如何使用 `.NET CLI` 创建并改造一个 `ASP.NET Core Web API` 项目,以实现基于许可证的授权机制。具体步骤包括创建项目、添加必要的 NuGet 包(如 `Standard.Licensing` 和 `Swashbuckle.AspNetCore`),以及修改 `Program.cs` 文件以集成自定义的许可证验证中间件。项目结构中新增了 `LicenseController` 接口用于处理授权相关操作,并通过测试流程验证了默认天气接口在未授权和授权状态下的响应情况。整个过程确保了应用程序能够在启动时正确验证许可证,保障系统的安全性与可控性。
170 8
.net8 使用 license 证书授权案例解析
|
4月前
|
机器学习/深度学习 人工智能 搜索推荐
技术革新下的培训新趋势:案例解析
从最初的“试试看”,到如今的“非做不可”,企业培训已经成为央国企和上市公司不可或缺的战略环节。无论是AI与大模型的赋能,DeepSeek,还是具身智能、智算技术和数据科学的实战应用,这些课程都在为企业打开新的可能性。
|
7月前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
426 76
|
5月前
|
Java API 数据处理
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
130 4
|
7月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
7月前
|
存储 监控 调度
云服务器成本优化深度解析与实战案例
本文深入探讨了云服务器成本优化的策略与实践,涵盖基本原则、具体策略及案例分析。基本原则包括以实际需求为导向、动态调整资源、成本控制为核心。具体策略涉及选择合适计费模式、优化资源配置、存储与网络配置、实施资源监控与审计、应用性能优化、利用优惠政策及考虑多云策略。文章还通过电商、制造企业和初创团队的实际案例,展示了云服务器成本优化的有效性,最后展望了未来的发展趋势,包括智能化优化、多云管理和绿色节能。
|
8月前
|
存储 人工智能 自然语言处理
高效档案管理案例介绍:文档内容批量结构化解决方案解析
档案文件内容丰富多样,传统人工管理耗时低效。思通数科AI平台通过自动布局分析、段落与标题检测、表格结构识别、嵌套内容还原及元数据生成等功能,实现档案的高精度分块处理和结构化存储,大幅提升管理和检索效率。某历史档案馆通过该平台完成了500万页档案的数字化,信息检索效率提升60%。
300 5
|
8月前
|
安全 测试技术 Go
Go语言中的并发编程模型解析####
在当今的软件开发领域,高效的并发处理能力是提升系统性能的关键。本文深入探讨了Go语言独特的并发编程模型——goroutines和channels,通过实例解析其工作原理、优势及最佳实践,旨在为开发者提供实用的Go语言并发编程指南。 ####
|
4月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
410 29
|
4月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
126 4

热门文章

最新文章

推荐镜像

更多
  • DNS