10.ReadWriteLock 读写锁

2024-08-21 03:08
文章标签 读写 readwritelock

本文主要是介绍10.ReadWriteLock 读写锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

10.ReadWriteLock 读写锁

读-写锁 ReadWriteLock

- ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。。- ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。对于读取操作占多数的数据结构。ReadWriteLock 能提供比独占锁更高的并发性。而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作。

示例代码

1.首先编写一个读写锁的示例

class ReadWriteLockDemo{//成员属性private int number = 0; // 定义一个用于读写的值//创建读写锁private ReadWriteLock lock = new ReentrantReadWriteLock();//读:设置读锁public void get(){lock.readLock().lock(); //设置读锁try{System.out.println(Thread.currentThread().getName() + " : " + number + " ,当前时间: " + System.currentTimeMillis());}finally{lock.readLock().unlock(); //释放读锁}}//写:设置写入锁public void set(int number){lock.writeLock().lock(); // 设置写入锁try{System.out.println(Thread.currentThread().getName());this.number = number; // 设置值}finally{lock.writeLock().unlock(); // 释放写锁}}
}

2.创建一个写入的线程 和 100个读取的线程

public class TestReadWriteLock {public static void main(String[] args) {//1.创建读写锁示例对象ReadWriteLockDemo rw = new ReadWriteLockDemo();//2.创建一个写入锁线程new Thread(new Runnable() {@Overridepublic void run() {rw.set((int)(Math.random() * 101)); // 随机设置值}}, "Write:").start();//2.创建100个读线程,查看读取的值是否一致for (int i = 0; i < 100; i++) {new Thread(new Runnable() {@Overridepublic void run() {rw.get();}}).start();}}
}

测试执行如下:

fe1ab01fb640132e3c522c53a502f4ef.png
image-20201104000012335

3.完整的示例代码

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;/*** 1. ReadWriteLock : 读写锁** 写写/读写 需要“互斥”* 读读 不需要互斥** @author Aron.li* @date 2020/11/3 23:52*/
public class TestReadWriteLock {public static void main(String[] args) {//1.创建读写锁示例对象ReadWriteLockDemo rw = new ReadWriteLockDemo();//2.创建一个写入锁线程new Thread(new Runnable() {@Overridepublic void run() {rw.set((int)(Math.random() * 101)); // 随机设置值}}, "Write:").start();//2.创建100个读线程,查看读取的值是否一致for (int i = 0; i < 100; i++) {new Thread(new Runnable() {@Overridepublic void run() {rw.get();}}).start();}}
}class ReadWriteLockDemo{//成员属性private int number = 0; // 定义一个用于读写的值//创建读写锁private ReadWriteLock lock = new ReentrantReadWriteLock();//读:设置读锁public void get(){lock.readLock().lock(); //设置读锁try{System.out.println(Thread.currentThread().getName() + " : " + number + " ,当前时间: " + System.currentTimeMillis());}finally{lock.readLock().unlock(); //释放读锁}}//写:设置写入锁public void set(int number){lock.writeLock().lock(); // 设置写入锁try{System.out.println(Thread.currentThread().getName());this.number = number; // 设置值}finally{lock.writeLock().unlock(); // 释放写锁}}
}

这篇关于10.ReadWriteLock 读写锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091943

相关文章

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

ShardingSphere之读写分离方式

《ShardingSphere之读写分离方式》:本文主要介绍ShardingSphere之读写分离方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录ShardingSphere-读写分离读写分离mysql主从集群创建 user 表主节点执行见表语句项目代码读写分

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

10. 文件的读写

10.1 文本文件 操作文件三大类: ofstream:写操作ifstream:读操作fstream:读写操作 打开方式解释ios::in为了读文件而打开文件ios::out为了写文件而打开文件,如果当前文件存在则清空当前文件在写入ios::app追加方式写文件ios::trunc如果文件存在先删除,在创建ios::ate打开文件之后令读写位置移至文件尾端ios::binary二进制方式