Java中的ReentrantReadWriteLock使用详解

 更新时间:2023年11月01日 10:56:24   作者:兴趣使然的程序猿  
这篇文章主要介绍了Java中的ReentrantReadWriteLock使用详解,ReentrantReadWriteLock是Java中的一个锁实现,它提供了读写分离的功能,这种读写分离的机制可以提高并发性能,特别适用于读多写少的场景,需要的朋友可以参考下

ReentrantReadWriteLock

ReadWriteLock即读写锁,ReadWriteLock的规则如下。

a.当有线程获取了Write锁时,其他线程不能获取到任何锁(写锁和读锁都不能。

b.当没有线程获取Wrete锁时,所有线程都可以获取Read锁。

c.当有Read锁存在时,获取不到Write锁。

1 ReentrantReadWriteLock实现类继承关系

ReentrantReadWriteLock实现类继承关系

可见该类实现了ReadWriteLock接口。

2 ReentrantReadWriteLock使用

创建一个读写锁。

static ReadWriteLock lock = new ReentrantReadWriteLock();

获取写锁。

lock.writeLock().lock();

释放写锁。

lock.writeLock().unlock();

获取读锁。

lock.readLock().lock();

释放读锁。

lock.readLock().unlock();

3 ReentrantReadWriteLock使用实例

该实例测试的是上边的规则c——当有Read锁存在时,获取不到Write锁。

让一个线程先获取到读锁并持有5秒钟。

这是其他线程尝试去获取写锁,发现5秒之后其他线程再开始写入然后在控制台打印出结果。

class ReadWriteLockDemo{
    static ReadWriteLock lock = new ReentrantReadWriteLock();
    static String text = "hello";
    public static void modify(){
        lock.writeLock().lock();
        try {
            System.err.println(Thread.currentThread().getName()+"开始修改");
            text += " "+Thread.currentThread().getName();
        }catch (Exception e){
            e.printStackTrace();
        }
        finally {
            lock.writeLock().unlock();
        }
    }
    public static void readWithReadLock(){
        lock.readLock().lock();
        try {
            System.err.println(text);
            Thread.sleep(5000);
            System.err.println("5秒过去了");
        }catch (Exception e){
        }finally {
            lock.readLock().unlock();
        }
    }
    public static void main(String[] args) throws InterruptedException {
        new Thread(()->{
            readWithReadLock();
        }).start();
        Thread.sleep(1000);
        for (int i=0;i<10;i++) {
            new Thread(() -> {
                modify();
            }).start();
        }
    }
}

读写锁执行结果

使用读写锁时需要需要明确上述三条规则。

并且可知,当读很多时,很难写入,所以读写锁不适用于读和写都很多的情况

到此这篇关于Java中的ReentrantReadWriteLock使用详解的文章就介绍到这了,更多相关ReentrantReadWriteLock使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IntelliJ IDEA中查看当前类的所有继承关系图

    IntelliJ IDEA中查看当前类的所有继承关系图

    今天小编就为大家分享一篇关于IntelliJ IDEA中查看当前类的所有继承关系图,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • SpringBoot拦截器以及源码详析

    SpringBoot拦截器以及源码详析

    拦截器在我们平时的项目中用处有很多,如:日志记录(我们后续章节会讲到)、用户登录状态拦截、安全拦截等等,所以下面这篇文章主要给大家介绍了关于SpringBoot拦截器以及源码的相关资料,需要的朋友可以参考下
    2021-07-07
  • Java数组优点和缺点_动力节点Java学院整理

    Java数组优点和缺点_动力节点Java学院整理

    本文给大家简单介绍下java数组的优点和缺点知识,需要的的朋友参考下吧
    2017-04-04
  • 如何获取 Spring heapdump中的明文密码

    如何获取 Spring heapdump中的明文密码

    Actuator是Spring Boot提供的应用系统监控的开源框架,在攻防场景里经常会遇到Actuator配置不当的情况,攻击者可以直接下载heapdump堆转储文件,本文介绍如何获取 Spring heapdump中的密码明文,需要的朋友可以参考下
    2022-07-07
  • Redis如何实现分布式锁详解

    Redis如何实现分布式锁详解

    分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁.本篇文章将介绍第二种方式,基于Redis实现分布式锁,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • java实现简易超市管理系统 附源码下载

    java实现简易超市管理系统 附源码下载

    这篇文章主要介绍了java实现简易超市管理系统(含源码),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 自定义log4j.properties的加载位置方式

    自定义log4j.properties的加载位置方式

    这篇文章主要介绍了自定义log4j.properties的加载位置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • springcloud-feign调用报错问题

    springcloud-feign调用报错问题

    这篇文章主要介绍了springcloud-feign调用报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • java实现识别二维码图片功能

    java实现识别二维码图片功能

    这篇文章主要为大家详细介绍了java实现识别二维码图片功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Mac M1 Java 开发环境配置详解

    Mac M1 Java 开发环境配置详解

    这篇文章主要介绍了Mac M1 Java 开发环境配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论