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

相关文章

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