ReadWriteLock读写锁

2024-04-17 03:52
文章标签 读写 readwritelock

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

ReadWriteLock

翻译:

读取写入锁

解释:

  • 在写入与读取的时候,会被其他线程插队,对于读取线程是不要紧的,但是对于读取线程,就会出现很多的问题

  • 在以前我们可以synchronized ,ReetrentLock锁住

  • 现在使用更加细腻的 ReadWriteLock

用法

不加锁的情况下

public class ReadAndWriteLockTest {public static void main(String[] args) {MyCache myCache = new MyCache();for (int i = 0; i < 5; i++) {int finalI = i;new Thread(() ->{myCache.pushItem(String.valueOf(finalI), finalI);},String.valueOf(i)).start();}for (int i = 0; i < 5; i++) {int finalI = i;new Thread(() ->{myCache.getItem(String.valueOf(finalI));},String.valueOf(i)).start();}}}
class MyCache{private Map<String ,Integer> map = new HashMap<>();public void pushItem(String key,Integer value){System.out.println(Thread.currentThread().getName() + "准备写入");map.put(key,value);System.out.println(Thread.currentThread().getName() + "写入成功");}public void getItem(String key){System.out.println(Thread.currentThread().getName() + "准备读取");map.get(key);System.out.println(Thread.currentThread().getName() + "读取成功");}
}
  • 会出现写入的时候,其他线程插队的情况

加入读写锁ReadWriteLock

class MyCache{private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();private Map<String ,Integer> map = new HashMap<>();public void pushItem(String key,Integer value){readWriteLock.writeLock().lock();try {System.out.println(Thread.currentThread().getName() + "准备写入");map.put(key,value);System.out.println(Thread.currentThread().getName() + "写入成功");} catch (Exception e) {throw new RuntimeException(e);} finally {readWriteLock.writeLock().unlock();}}public void getItem(String key){readWriteLock.readLock().lock();try {System.out.println(Thread.currentThread().getName() + "准备读取");map.get(key);System.out.println(Thread.currentThread().getName() + "读取成功");} catch (Exception e) {throw new RuntimeException(e);} finally {readWriteLock.readLock().unlock();}}
}
  • ReadWriteLock是接口,实现类是 ReetrantReadWirteLock,所以接口与实现类啦
  • 通过上述的内容,就可以实现了在写入的时候,没有新的线程的插队
  • 但是为什么是所有的 写入数据 先执行,这是我所不知道的

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



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

相关文章

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二进制方式

【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