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使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决2022.3.1版本中 IDEA中 XML文件提示屎黄色背景的方法

    解决2022.3.1版本中 IDEA中 XML文件提示屎黄色背景的方法

    这篇文章主要介绍了解决2022.3.1版本中 IDEA中 XML文件屎黄色背景 的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • JavaSE实现文件压缩与解压缩的技巧分享

    JavaSE实现文件压缩与解压缩的技巧分享

    我们在日常实际开发中,对于文件压缩和解压缩场景,是非常常见的操作,本文详细介绍JavaSE中文件压缩和解压缩的实现方法,包括源代码解析、应用场景案例、优缺点分析、案例演示、文末总结等等,请同学们耐心阅读
    2024-03-03
  • 基于@Table注解无法使用及报红的解决

    基于@Table注解无法使用及报红的解决

    这篇文章主要介绍了基于@Table注解无法使用及报红的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 如何在springboot中配置和使用mybatis-plus

    如何在springboot中配置和使用mybatis-plus

    这篇文章主要给大家介绍了关于如何在springboot中配置和使用mybatis-plus的相关资料,MyBatis Plus是MyBatis的增强版,旨在提供更多便捷的特性,减少开发工作,同时保留了MyBatis的灵活性和强大性能,需要的朋友可以参考下
    2023-11-11
  • 浅析Java中内部锁和显示锁的使用

    浅析Java中内部锁和显示锁的使用

    在java中锁主要两类,内部锁synchronized和显示锁java.util.concurrent.locks.Lock,本文将来和大家聊聊这两者的相关知识,需要的可以参考一下
    2023-06-06
  • 基于java springboot + mybatis实现电影售票管理系统

    基于java springboot + mybatis实现电影售票管理系统

    这篇文章主要介绍了基于java springboot + mybatis实现的完整电影售票管理系统基于java springboot + mybatis,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • springboot拦截器Interceptor的使用,你都了解吗

    springboot拦截器Interceptor的使用,你都了解吗

    springmvc 中的拦截器可以对请求进行判别,在请求到达控制器之前,把非法的请求给拦截掉下面来说一说, 它在springboot中的使用,感兴趣的朋友一起看看吧
    2021-07-07
  • java使用RSA加密方式实现数据加密解密的代码

    java使用RSA加密方式实现数据加密解密的代码

    这篇文章给大家分享java使用RSA加密方式实现数据加密解密,通过实例代码文字相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下
    2019-11-11
  • Java线程状态变换过程代码解析

    Java线程状态变换过程代码解析

    这篇文章主要介绍了Java线程状态变换过程代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 将本地JAR文件手动添加到Maven本地仓库的实现过程

    将本地JAR文件手动添加到Maven本地仓库的实现过程

    在Java开发中,使用Maven作为项目管理工具已经成为了主流的选择,Maven提供了强大的依赖管理功能,可以轻松地下载和管理项目所需的库和工具,在某些情况下,你可能会需要将本地下载的JAR文件手动添加到Maven的本地仓库中,这篇博客将详细介绍如何实现这一过程
    2024-10-10

最新评论