当前位置: 首页 > news >正文

17 | ReadWriteLock:如何快速实现一个完备的缓存?

第二部分:并发工具类

17 | ReadWriteLock:如何快速实现一个完备的缓存?

文章目录

  • 第二部分:并发工具类
    • 17 | ReadWriteLock:如何快速实现一个完备的缓存?
      • 那什么是读写锁呢?
      • 快速实现一个缓存
      • 实现缓存的按需加载
      • 读写锁的升级与降级
      • 总结
      • 课后思考



前面我们介绍了管程和信号量这两个同步原语在 Java 语言中的实现,理论上用这两个同步原语中任何一个都可以解决所有的并发问题。那 Java SDK 并发包里为什么还有很多其他的工具类呢?原因很简单:分场景优化性能,提升易用性。

今天我们就介绍一种非常普遍的并发场景:读多写少场景。实际工作中,为了优化性能,我们经常会使用缓存,例如缓存元数据、缓存基础数据等,这就是一种典型的读多写少应用场景。缓存之所以能提升性能,一个重要的条件就是缓存的数据一定是读多写少的,例如元数据和基础数据基本上不会发生变化(写少),但是使用它们的地方却很多(读多)。

针对读多写少这种并发场景,Java SDK 并发包提供了读写锁——ReadWriteLock,非常容易使用,并且性能很好。

那什么是读写锁呢?

读写锁,并不是 Java 语言特有的,而是一个广为使用的通用技术,所有的读写锁都遵守以下三条基本原则:

  1. 允许多个线程同时读共享变量;
  2. 只允许一个线程写共享变量;
  3. 如果一个写线程正在执行写操作,此时禁止读线程读共享变量。

读写锁与互斥锁的一个重要区别就是读写锁允许多个线程同时读共享变量,而互斥锁是不允许的,这是读写锁在读多写少场景下性能优于互斥锁的关键。但读写锁的写操作是互斥的,当一个线程在写共享变量的时候,是不允许其他线程执行写操作和读操作。

快速实现一个缓存

下面我们就实践起来,用 ReadWriteLock 快速实现一个通用的缓存工具类。

在下面的代码中,我们声明了一个 Cache 类,其中类型参数 K 代表缓存里 key 的类型,V 代表缓存里 value 的类型。缓存的数据保存在 Cache 类内部的 HashMap 里面,HashMap 不是线程安全的,这里我们使用读写锁 ReadWriteLock 来保证其线程安全。ReadWriteLock 是一个接口,它的实现类是 ReentrantReadWriteLock,通过名字你应该就能判断出来,它是支持可重入的。下面我们通过 rwl 创建了一把读锁和一把写锁。

问题:什么是可重入?

答案:可重入指的是:同一个线程可以重复获取同一把锁,而不会把自己锁死。

Cache 这个工具类,我们提供了两个方法,一个是读缓存方法 get(),另一个是写缓存方法 put()。读缓存需要用到读锁,读锁的使用和前面我们介绍的 Lock 的使用是相同的,都是 try{}finally{}这个编程范式。写缓存则需要用到写锁,写锁的使用和读锁是类似的。这样看来,读写锁的使用还是非常简单的。

class Cache<K,V> { final Map<K, V> m =
http://www.jsqmd.com/news/1070933/

相关文章:

  • 数字化导板引导种植的精度评估与误差控制策略研究
  • Oracle中的插拔式数据库(CDB/PDB)
  • 鸿蒙PC适配llvm-gcc-compat编译安装第三方库chrono,打造Rust 第三方日期时间处理库
  • 从拉流、叠加到国标多平台分发:SmartMediaKit 多模态融合推流方案设计
  • 16-Redis 与 Redisson 采集:缓存节点如何参与问题定位
  • Web渗透测试实战:SQL注入漏洞从入门到深度防御
  • 智能硬件产品 App 全球发布 第 6 章:IoT App 特殊审核体系
  • 无人机航拍输电线路缺陷检测开源数据集|电力电缆散股异物识别YOLODETR双格式图像库10452期
  • 基于U2-Net与深度度量学习的自动化花粉显微图像分析系统实践
  • Linux线程3.0-线程同步与互斥,C/C++互斥锁。
  • 关于GraalVM的说明
  • 豆包导出pdf怎么调顺序?试试AI 导出鸭智能排序
  • 联邦学习实战:破解非独立同分布数据困局的算法策略与调优指南
  • 鸿蒙PC适配llvm-gcc-compat编译安装第三方库itertools,打造Rust 第三方迭代器增强库
  • 东莞企业做GEO为什么AI不推荐你-信源权重的3个硬指标拆开看
  • 基于MobileNetV3的轻量化人脸年龄估计模型:MobileAgeNet实战指南
  • AI开发-多路径写入一致性:从一次 Debug 到系统性防御
  • 从“会聊天“到“能干活“:用 OpenCode 给自己找个 AI 搭子
  • 【收藏夹必备】写博文还在用“●“做列表?这些图标让文章质感翻倍!
  • 【硬核长文】万字拆解无线网络核心:AP(无线访问接入点)从底层原理到企业级实战调优指南
  • HoRain云--R语言列表操作全指南:从入门到精通
  • 无人机遥感国土目标检测数据集 无人机耕地数据集 无人机道路农田检测 国土遥感地物实例分割数据集 yolo数据集第10759期
  • 五、进程控制
  • 程序员面试翻车?我用了两个月测遍AI面试工具,最终只推荐这一个
  • Redis...2
  • 影刀RPA新手教程:零基础入门完全指南——从下载安装到独立开发你的第一个自动化流程
  • Ntk-aware 插值
  • 医疗AI多模态学习:M-IDoL框架突破信息模糊困境
  • 流体-结构耦合与声子亚表面在湍流减阻中的应用
  • 反射的定义、使用方式、优缺点和具体使用场景