快速实现一个缓存

public class Cache<K,V> {final Map<K, V> m = new HashMap<>();final ReadWriteLock rwl = new ReentrantReadWriteLock();// 读锁final Lock r = rwl.readLock();// 写锁final Lock w = rwl.writeLock();// 读缓存public V get(K key) {r.lock();try { return m.get(key); }finally { r.unlock(); }}// 写缓存public V put(String key, Data v) {w.lock();try { return m.put(key, v); }finally { w.unlock(); }}
}

实现缓存的按需加载

public class Cache<K,V> {final Map<K, V> m = new HashMap<>();final ReadWriteLock rwl = new ReentrantReadWriteLock();final Lock r = rwl.readLock();final Lock w = rwl.writeLock();public V getWithLoad(K key) {V v = get(key);// 缓存中存在,返回if(v != null) {  return v;}  // 缓存中不存在,查询数据库w.lock();      try {// 再次验证,其他线程可能已经查询过数据库v = m.get(key); if(v == null){  // 查询数据库v= loadData(...);m.put(key, v);}} finally{w.unlock();}return v; }// 读缓存public V get(K key) {r.lock();try { return m.get(key); }finally { r.unlock(); }}}

读写锁的升级与降级

锁的升级--禁止

// 读缓存
r.lock();
try {v = m.get(key); if (v == null) {w.lock();try {// 再次验证并更新缓存// 省略详细代码} finally{w.unlock();}}
} finally{r.unlock();
}

锁的降级--支持

public class CachedData {Object data;volatile boolean cacheValid;final ReadWriteLock rwl = new ReentrantReadWriteLock();// 读锁  final Lock r = rwl.readLock();// 写锁final Lock w = rwl.writeLock();void processCachedData() {// 获取读锁r.lock();if (!cacheValid) {// 释放读锁,因为不允许读锁的升级r.unlock();// 获取写锁w.lock();try {// 再次检查状态  if (!cacheValid) {data = ...cacheValid = true;}// 释放写锁前,降级为读锁// 降级是可以的r.lock(); } finally {// 释放写锁w.unlock(); }}// 此处仍然持有读锁try {use(data);} finally {r.unlock();}}
}

Java并发编程实战~ReadWriteLock~相关推荐

  1. 【极客时间】《Java并发编程实战》学习笔记

    目录: 开篇词 | 你为什么需要学习并发编程? 内容来源:开篇词 | 你为什么需要学习并发编程?-极客时间 例如,Java 里 synchronized.wait()/notify() 相关的知识很琐 ...

  2. 《Java 并发编程实战》--读书笔记

    Java 并发编程实战 注: 极客时间<Java 并发编程实战>–读书笔记 GitHub:https://github.com/ByrsH/Reading-notes/blob/maste ...

  3. Java并发编程实战笔记2:对象的组合

    设计线程安全的类 在设计现车让安全类的过程之中,需要包含以下三步: 找出构成对象状态的所有变量 找出约束状态变量的不变性条件 建立对象状态的并发访问策略 实例封闭 通过封闭机制与合适的加锁策略结合起来 ...

  4. aqs clh java_【Java并发编程实战】—– AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形. 其主要从双方面进行了改造:节点的结构与节点等待机制.在结构上引入了 ...

  5. java 多线程缓存_[Java教程]【JAVA并发编程实战】12、使用condition实现多线程下的有界缓存先进先出队列...

    [Java教程][JAVA并发编程实战]12.使用condition实现多线程下的有界缓存先进先出队列 0 2016-11-29 17:00:10 package cn.study.concurren ...

  6. Java并发编程实战————恢复中断

    中断是一种协作机制,一个线程不能强制其他线程停止正在执行的操作而去执行其他操作. 什么是中断状态? 线程类有一个描述自身是否被中断了的boolean类型的状态,可以通过调用 .isInterrupte ...

  7. Java并发编程实战————Executor框架与任务执行

    引言 本篇博客介绍通过"执行任务"的机制来设计应用程序时需要掌握的一些知识.所有的内容均提炼自<Java并发编程实战>中第六章的内容. 大多数并发应用程序都是围绕&qu ...

  8. Java并发编程实战————Semaphore信号量的使用浅析

    引言 本篇博客讲解<Java并发编程实战>中的同步工具类:信号量 的使用和理解. 从概念.含义入手,突出重点,配以代码实例及讲解,并以生活中的案例做类比加强记忆. 什么是信号量 Java中 ...

  9. Java并发编程实战_不愧是领军人物!这种等级的“Java并发编程宝典”谁能撰写?...

    前言 大家都知道并发编程技术就是在同一个处理器上同时的去处理多个任务,充分的利用到处理器的每个核心,最大化的发挥处理器的峰值性能,这样就可以避免我们因为性能而产生的一些问题. 大厂的核心负载肯定是非常 ...

最新文章

  1. [PHP]php发布和调用Webservice接口的案例
  2. 在docker中安装RabbitMQ
  3. boost::fusion::as_vector用法的测试程序
  4. 结对开发——环形一维数组求最大子数组和
  5. html css入门经典 pdf,CSS入门经典
  6. 东南亚支付——柬埔寨行
  7. IFrame中 Forms验证超时页面跳转跳出框架 简单解决方法
  8. 训练一个简单的游戏AI(Deep Q Network)
  9. 警惕!ADSL远程盗号竟如此简单(转)
  10. 手工卸载各版本金蝶K/3客户端的方法
  11. 【国外网站软件下载慢解决】
  12. Linux初级入门百篇--lsof工具
  13. Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例
  14. 大三计算机写学术论文,学院大三本科生在高水平国际会议发表学术论文
  15. Mac电脑下载软件的几个网站
  16. 解决Ubuntu 22.04 LTS作为nfs server时根文件系统挂载失败的问题
  17. 外贸工具WhatsApp
  18. 免费的AI线稿图片上色工具+黑白图片上色网站合集(2021年实测可用)
  19. 当case when then else end 语句遇上sum或count等统计函数
  20. android 监听sim卡状态,android监控sim卡有没有服务示例(sim卡管理)

热门文章

  1. 最全Java架构师130面试题:微服务、高并发、大数据、缓存等中间件
  2. .依存句法分析--提取用户评论
  3. 玩转算法之面试第九章-动态规划
  4. 阿里-2019算法岗笔试编程题-kmp匹配
  5. tensorflow--模型的保存和提取
  6. python 列表推导式
  7. JavaScript(js)/上
  8. 『重构--改善既有代码的设计』读书笔记----Split Temporary Variable
  9. Innodb 表空间卸载、迁移、装载
  10. 语音合成与识别技术在C#中的应用 (转 )