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

相关文章

10. 文件的读写

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

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

关于使用cspreadsheet读写EXCEL表格数据的问题

前几天项目有读写EXCEL表格的需求,我就找了大概有几种,大致分为:COM方法、ODBC方法、OLE方法、纯底层格式分析方法。由于COM方法要求必须安装有OFFICE的EXCEL组件,纯底层格式分析方法又很多功能需要自行去完善,所有最终选择了数据库的方法,用数据库的方法去存取xls格式的数据。网上有一个高手写的CSpreedSheet,看了一下提供的接口,感觉挺好用的。在使用的过程中发现几个

linux 内核提权总结(demo+exp分析) -- 任意读写(四)

hijack_modprobe_path篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     原理同hijack_prctl, 当用户执行错误格式的elf文件时内核调用call_usermod

linux 内核提权总结(demo+exp分析) -- 任意读写(三)

hijack_prctl篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   prctl函数: 用户态函数,可用于定制进程参数,非常适合和内核进行交互 用户态执行prctl函数后触发prctl系统

linux 内核提权总结(demo+exp分析) -- 任意读写(二)

hijack_vdso篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     vdso: 内核实现的一个动态库,存在于内核,然后映射到用户态空间,可由用户态直接调用 内核中的vdso如果被修改

linux 内核提权总结(demo+exp分析) -- 任意读写(一)

cred篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   每个线程在内核中都对应一个线程结构块thread_infothread_info中存在task_struct类型结构体 struct t

Java 文件读写最好是用buffer对于大文件可以加快速度

参考例子: FileReader fileReader = new FileReader(filename);BufferedReader bufferedReader = new BufferedReader(fileReader);List<String> lines = new ArrayList<String>();String line = null;while ((line =

Java并发:互斥锁,读写锁,Condition,StampedLock

3,Lock与Condition 3.1,互斥锁 3.1.1,可重入锁 锁的可重入性(Reentrant Locking)是指在同一个线程中,已经获取锁的线程可以再次获取该锁而不会导致死锁。这种特性允许线程在持有锁的情况下,可以递归地调用自身的同步方法或代码块,而不会因为再次尝试获取相同的锁而被阻塞。显然,通常的锁都要设计成可重入的。否则就会发生死锁。 synchronized关键字,就是

Windows环境下SD卡多分区 隐藏分区 解决python裸读写扇区失败

SD卡分区 右键“我的电脑”->“管理”->“磁盘管理”; 如果SD卡有文件系统,点击"删除卷",重新做卡; 删除文件系统后如下图,点击“新建简单卷”; 在导航页“指定卷大小”,设置分区的大小,留出剩余的空间; python读写SD卡 这里需要注意的是,写SD卡需要加锁,否则写不成功 #带文件系统,需要锁定卷,否则无法写扇区@contextlib.contextmanagerd