iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java 读写锁的使用及它的优点
  • 958
分享到

java 读写锁的使用及它的优点

2024-04-02 19:04:59 958人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录1.读写锁使用1.1 读读不互斥1.2 读写互斥1.3 写写互斥2.优点分析3.适用场景总结前言: 读写锁(Readers-Writer Lock)顾名思义是一把锁分为两部分:读

前言:

读写锁(Readers-Writer Lock)顾名思义是一把锁分为两部分:读锁和写锁,其中读锁允许多个线程同时获得,因为读操作本身是线程安全的,而写锁则是互斥锁,不允许多个线程同时获得写锁,并且写操作和读操作也是互斥的。总结来说,读写锁的特点是:读读不互斥、读写互斥、写写互斥

1.读写锁使用

在 Java 语言中,读写锁是使用 ReentrantReadWriteLock 类来实现的,其中:

  • ReentrantReadWriteLock.ReadLock表示读锁,它提供了 lock 方法进行加锁、unlock 方法进行解锁。
  • ReentrantReadWriteLock.WriteLock表示写锁,它提供了 lock 方法进行加锁、unlock 方法进行解锁。

它的基础使用如下代码所示:

// 创建读写锁
final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
// 获得读锁
final ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock();
// 获得写锁
final ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock();
// 读锁使用
readLock.lock();
try {
    // 业务代码...
} finally {
    readLock.unlock();
}
// 写锁使用
writeLock.lock();
try {
    // 业务代码...
} finally {
    writeLock.unlock();
}

1.1 读读不互斥

多个线程可以同时获取到读锁,称之为读读不互斥,如下代码所示:

// 创建读写锁
final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
// 创建读锁
final ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock();
Thread t1 = new Thread(() -> {
    readLock.lock();
    try {
        System.out.println("[t1]得到读锁.");
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("[t1]释放读锁.");
        readLock.unlock();
    }
});
t1.start();
Thread t2 = new Thread(() -> {
    readLock.lock();
    try {
        System.out.println("[t2]得到读锁.");
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("[t2]释放读锁.");
        readLock.unlock();
    }
});
t2.start();

以上程序执行结果如下: 

1.2 读写互斥

读锁和写锁同时使用是互斥的(也就是不能同时获得),这称之为读写互斥,如下代码所示:

// 创建读写锁
final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
// 创建读锁
final ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock();
// 创建写锁
final ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock();
// 使用读锁
Thread t1 = new Thread(() -> {
    readLock.lock();
    try {
        System.out.println("[t1]得到读锁.");
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("[t1]释放读锁.");
        readLock.unlock();
    }
});
t1.start();
// 使用写锁
Thread t2 = new Thread(() -> {
    writeLock.lock();
    try {
        System.out.println("[t2]得到写锁.");
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("[t2]释放写锁.");
        writeLock.unlock();
    }
});
t2.start();

以上程序执行结果如下: 

1.3 写写互斥

多个线程同时使用写锁也是互斥的,这称之为写写互斥,如下代码所示:

// 创建读写锁
final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
// 创建写锁
final ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock();
Thread t1 = new Thread(() -> {
    writeLock.lock();
    try {
        System.out.println("[t1]得到写锁.");
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("[t1]释放写锁.");
        writeLock.unlock();
    }
});
t1.start();

Thread t2 = new Thread(() -> {
    writeLock.lock();
    try {
        System.out.println("[t2]得到写锁.");
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("[t2]释放写锁.");
        writeLock.unlock();
    }
});
t2.start();

以上程序执行结果如下: 

2.优点分析

  • 提高了程序执行性能:多个读锁可以同时执行,相比于普通锁在任何情况下都要排队执行来说,读写锁提高了程序的执行性能。
  • 避免读到临时数据:读锁和写锁是互斥排队执行的,这样可以保证了读取操作不会读到写了一半的临时数据。

3.适用场景

读写锁适合多读少写的业务场景,此时读写锁的优势最大。

总结

读写锁是一把锁分为两部分:读锁和写锁,其中读锁允许多个线程同时获得,而写锁则是互斥锁。它的完整规则是:读读不互斥、读写互斥、写写互斥。它适用于多读的业务场景,使用它可以有效的提高程序的执行性能,也能避免读取到操作了一半的临时数据。

到此这篇关于java 读写锁的使用及它的优点的文章就介绍到这了,更多相关Java读写锁内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: java 读写锁的使用及它的优点

本文链接: https://www.lsjlt.com/news/148409.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java 读写锁的使用及它的优点
    目录1.读写锁使用1.1 读读不互斥1.2 读写互斥1.3 写写互斥2.优点分析3.适用场景总结前言: 读写锁(Readers-Writer Lock)顾名思义是一把锁分为两部分:读...
    99+
    2024-04-02
  • java读写锁怎么使用及优点是什么
    这篇文章主要介绍了java读写锁怎么使用及优点是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java读写锁怎么使用及优点是什么文章都会有所收获,下面我们一起来看看吧。前言:读写锁(Readers-Writ...
    99+
    2023-06-30
  • Java 重入锁和读写锁的具体使用
    目录重入锁 1. 实现重进入 2. 公平与非公平获取锁的区别 读写锁 1. 接口示例 2. 读写状态的设计 3. 写锁的获取与释放 4. 读锁的获取与释放 5. 锁降级 重入锁 重...
    99+
    2024-04-02
  • java读写锁的使用场景有哪些
    当多个线程需要读取共享数据,但只有少数线程需要写入数据时,使用读写锁可以提高并发性能。 当对共享数据的读操作比写操作频繁时,...
    99+
    2024-04-03
    java
  • 一文了解Java读写锁ReentrantReadWriteLock的使用
    目录概述ReentrantReadWriteLock介绍实战案例验证读读共享模式验证读写互斥模式真实缓存例子概述 ReentrantReadWriteLock不知道大家熟悉吗?其实在...
    99+
    2022-11-13
    Java 读写锁ReentrantReadWriteLock Java 读写锁 Java ReentrantReadWriteLock
  • Java读写锁ReentrantReadWriteLock怎么使用
    这篇文章主要介绍“Java读写锁ReentrantReadWriteLock怎么使用”,在日常操作中,相信很多人在Java读写锁ReentrantReadWriteLock怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-06-02
  • java读写锁的使用方法是什么
    在Java中,读写锁是一种特殊的锁,允许多个线程同时读取共享资源,但只允许一个线程进行写操作。读写锁通过ReadWriteLock接...
    99+
    2024-04-03
    java
  • Java 重入锁和读写锁怎么使用
    这篇文章主要介绍“Java 重入锁和读写锁怎么使用”,在日常操作中,相信很多人在Java 重入锁和读写锁怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java 重入锁和读写锁怎么使用”的疑惑有所帮助!...
    99+
    2023-06-08
  • C++std::shared_mutex读写锁的使用
    目录0.前言1.认识std::shared_mutex2.实例演示0.前言 读写锁把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。C...
    99+
    2024-04-02
  • JavaAQS中ReentrantReadWriteLock读写锁的使用
    目录一. 简介二. 接口及实现类三.使用四. 应用场景五. 锁降级六.源码解析七.总结一. 简介 为什么会使用读写锁? 日常大多数见到的对共享资源有读和写的操作,写操作并没有读操作那...
    99+
    2023-02-02
    Java 读写锁ReentrantReadWriteLock Java 读写锁 Java ReentrantReadWriteLock
  • Java读写锁ReadWriteLock的创建使用及测试分析示例详解
    目录简介基本方法介绍创建读写锁使用读锁readLock().lock()使用读锁readLock().tryLock();readLock().tryLock(6L, TimeUni...
    99+
    2023-01-12
    Java读写锁ReadWriteLock Java ReadWriteLock
  • MySQL表锁、行锁、排它锁及共享锁的使用详解
    目录前言一、事务隔离机制的选择二、表级锁&行级锁三、排它锁(Exclusive)和共享锁(Shared)1. 测试不同事务之间排它锁和共享锁的兼容性2. 测试行锁加在索引项上...
    99+
    2024-04-02
  • java中读写锁的作用有哪些
    这篇文章给大家介绍java中读写锁的作用有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以优雅的...
    99+
    2023-06-14
  • Java面试突击为什么要用HTTPS及它的优点
    目录前言1.HTTP2.HTTPS2.1 解决信任问题2.2 解决明文传输和完整性问题加密的分类总结前言 说到 HTTPS 相信大部分人都是不陌生,因为目前我们使用的绝大数网站都是基...
    99+
    2024-04-02
  • Java 并发包中的读写锁及其实现分析
    这期内容当中小编将会给大家带来有关Java 并发包中的读写锁及其实现分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 前言在Java并发包中常用的锁(如:ReentrantLock),基本上都是排他...
    99+
    2023-06-17
  • C++的std::shared_mutex读写锁怎么使用
    这篇“C++的std::shared_mutex读写锁怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++的std:...
    99+
    2023-06-29
  • Golang函数的读写锁和互斥锁的使用心得
    在 Golang 中,锁(Lock)是并发控制的重要机制之一。锁本质上是一种同步原语,用于控制共享资源的访问。在实际应用中,常用的锁包括互斥锁(Mutex)和读写锁(RWLock)。本文将介绍 Golang 函数中读写锁和互斥锁的使用心得。...
    99+
    2023-05-17
    Golang 读写锁 互斥锁
  • GoLang中的互斥锁Mutex和读写锁RWMutex使用教程
    目录一、竞态条件与临界区和同步工具(1)竞态条件(2)临界区(3)同步工具二、互斥量三、使用互斥锁的注意事项(1)使用互斥锁的注意事项(2)使用defer语句解锁(3)sync.Mu...
    99+
    2023-01-09
    Go Mutex和RWMutex Go Mutex GoLang RWMutex
  • 关于读写锁算法的Java实现及思考是怎么样的
    本篇文章给大家分享的是有关关于读写锁算法的Java实现及思考是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。问题背景:多个线程对一个共享的资源进行读写访问。写线程之间需...
    99+
    2023-06-17
  • Java中读写锁ReadWriteLock的原理与应用详解
    目录什么是读写锁?为什么需要读写锁?读写锁的特点读写锁的使用场景读写锁的主要成员和结构图读写锁的实现原理读写锁总结Java并发编程提供了读写锁,主要用于读多写少的场景,今天我就重点来...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作