news 2026/6/24 5:35:10

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 =
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/24 5:31:26

基于C#的飞机大战

本周主要学习了基于 C# WinForms 开发的一款名为“雷霆战机”的射击类小游戏的完整实现&#xff0c;采用面向对象的设计思想&#xff0c;将游戏元素抽象为各类对象&#xff0c;核心实现了敌机生成、子弹发射、碰撞检测、生命值管理、游戏结束等核心逻辑。以下是对各部分的详细解…

作者头像 李华
网站建设 2026/6/24 5:24:32

模块化驱动架构,升级不再怕冲突

告别“升级即停机”&#xff1a;ROCm 7.x 模块化驱动架构实战 在大模型推理服务的运维一线&#xff0c;最让人头疼的往往不是模型本身的调优&#xff0c;而是底层环境的“牵一发而动全身”。过去在 AMD Instinct GPU 上部署 ROCm 栈时&#xff0c;我们常陷入一种两难境地&#…

作者头像 李华
网站建设 2026/6/24 5:23:40

反射的定义、使用方式、优缺点和具体使用场景

目录 1.反射的定义 2.反射的使用方式 3.反射的使用场景 3.1 主流开源框架底层&#xff08;反射最核心应用场景&#xff09; 1. Spring 全家桶 2. ORM 持久层框架&#xff08;MyBatis/Hibernate&#xff09; 3. JSON 序列化工具&#xff08;Jackson/FastJSON/Gson&#x…

作者头像 李华
网站建设 2026/6/24 5:16:39

YOLO目标检测入门讲义——RoboMaster视觉篇

引言在RoboMaster的赛场上&#xff0c;机器人需要在一秒之内完成“看到敌人—识别装甲板—计算提前量—控制云台瞄准—发射弹丸”这一整套动作。这个链条的第一步&#xff0c;也是最关键的一步&#xff0c;就是视觉目标检测。传统方法依靠装甲板灯条发光的特性&#xff0c;通过…

作者头像 李华
网站建设 2026/6/24 5:16:11

教育视频摘要技术TR-EduVSum的创新与应用

1. 教育视频摘要的技术挑战与TR-EduVSum的创新价值在当今数字化教育时代&#xff0c;YouTube等平台上的教学视频数量呈爆炸式增长。以"数据结构与算法"这类计算机核心课程为例&#xff0c;单是土耳其语相关视频就超过数千小时。但学生面临一个普遍困境&#xff1a;完…

作者头像 李华