JUC并发编程学习笔记(八)读写锁
1.JUC并发编程学习笔记(二)Lock锁(重点)2.JUC并发编程学习笔记(一)认知进程和线程3.JUC并发编程学习笔记(三)生产者和消费者问题4.JUC并发编程学习笔记(四)8锁现象5.JUC并发编程学习(五)集合类不安全6.JUC并发编程学习笔记(六)Callable(简单)7.JUC并发编程学习笔记(七)常用的辅助类
8.JUC并发编程学习笔记(八)读写锁
9.JUC并发编程学习笔记(九)阻塞队列10.JUC并发编程学习笔记(十)线程池(重点)11.JUC并发编程学习(十一)四大函数式接口(必备)12.JUC并发编程学习笔记(十二)Stream流式计算13.JUC并发编程学习(十三)ForkJoin14.JUC并发编程学习笔记(十四)异步回调15.JUC并发编程学习笔记(十五)JMM16.JUC并发编程学习笔记(十七)彻底玩转单例模式17.JUC并发编程学习笔记(十九)原子引用18.JUC并发编程(终章)各种锁的理解19.JUC并发编程学习笔记(十六)Volatile20.JUC并发编程学习笔记(十八)深入理解CAS读写锁
ReadWriteLock
ReadWriteLock只存在一个实现类那就是ReentrantReadWriteLock,他可以对锁实现更加细粒化的控制
读的时候可以有多个阅读器线程同时参与,写的时候只希望写入线程是独占的
Demo:
package org.example.rw; import java.util.HashMap; import java.util.Map; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class ReadWriteLockDemo { /* * 读读 - 可以共存 (共享锁) * 读写 - 不能共存 (独占锁) * 写写 - 不能共存 (独占锁) * */ public static void main(String[] args) { MyCache myCache = new MyCache(); // 写入:要求在写入时不能存在插队的情况,以防止写入时资源被抢占 for (int i = 1; i <= 5; i++) { final int temp = i; new Thread(()->{ myCache.put(""+temp,temp); },String.valueOf(i)).start(); } // 读取:可以插队抢占资源以实现资源的最大化利用 for (int i = 1; i <= 5; i++) { final int temp = i; new Thread(()->{ myCache.get(temp+""); },String.valueOf(i)).start(); } } } class MyCache{ private volatile Map<String,Object> cache = new HashMap<>(); ReadWriteLock rwLock = new ReentrantReadWriteLock(); // 细粒化控制:写 - 只希望同一时间只有一条线程写入,写入完成后再进入下一位 public void put(String key,Object value){ rwLock.writeLock().lock(); try { System.out.println(Thread.currentThread().getName()+":"+key+"开始写入"); cache.put(key,value); System.out.println(Thread.currentThread().getName()+":"+key+"写入完成"); }catch (Exception e){ e.printStackTrace(); }finally { rwLock.writeLock().unlock(); } } // 细粒化控制:读 - 所有人都可以读 public Object get(String key){ rwLock.readLock().lock(); Object o = null; try { System.out.println(Thread.currentThread().getName()+":"+key+"开始读取"); o = cache.get(key); System.out.println(Thread.currentThread().getName()+":"+key+"读取完成"); }catch (Exception e){ e.printStackTrace(); }finally { rwLock.readLock().unlock(); } return o; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构