JUC并发编程学习笔记(八)读写锁

慢吞云雾缓吐愁  金牌会员 | 2023-12-4 15:17:04 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 932|帖子 932|积分 2796

读写锁

ReadWriteLock
ReadWriteLock只存在一个实现类那就是ReentrantReadWriteLock,他可以对锁实现更加细粒化的控制
读的时候可以有多个阅读器线程同时参与,写的时候只希望写入线程是独占的

Demo:
  1. package org.example.rw;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.concurrent.Semaphore;
  5. import java.util.concurrent.TimeUnit;
  6. import java.util.concurrent.locks.ReadWriteLock;
  7. import java.util.concurrent.locks.ReentrantReadWriteLock;
  8. public class ReadWriteLockDemo {
  9.     /*
  10.     * 读读 - 可以共存 (共享锁)
  11.     * 读写 - 不能共存 (独占锁)
  12.     * 写写 - 不能共存 (独占锁)
  13.     * */
  14.     public static void main(String[] args) {
  15.         MyCache myCache = new MyCache();
  16. //        写入:要求在写入时不能存在插队的情况,以防止写入时资源被抢占
  17.         for (int i = 1; i <= 5; i++) {
  18.             final int temp = i;
  19.             new Thread(()->{
  20.                 myCache.put(""+temp,temp);
  21.             },String.valueOf(i)).start();
  22.         }
  23. //        读取:可以插队抢占资源以实现资源的最大化利用
  24.         for (int i = 1; i <= 5; i++) {
  25.             final int temp = i;
  26.             new Thread(()->{
  27.                 myCache.get(temp+"");
  28.             },String.valueOf(i)).start();
  29.         }
  30.     }
  31. }
  32. class MyCache{
  33.     private volatile Map<String,Object> cache = new HashMap<>();
  34.     ReadWriteLock rwLock = new ReentrantReadWriteLock();
  35. //    细粒化控制:写 - 只希望同一时间只有一条线程写入,写入完成后再进入下一位
  36.     public void put(String key,Object value){
  37.         rwLock.writeLock().lock();
  38.         try {
  39.             System.out.println(Thread.currentThread().getName()+":"+key+"开始写入");
  40.             cache.put(key,value);
  41.             System.out.println(Thread.currentThread().getName()+":"+key+"写入完成");
  42.         }catch (Exception e){
  43.             e.printStackTrace();
  44.         }finally {
  45.             rwLock.writeLock().unlock();
  46.         }
  47.     }
  48. //    细粒化控制:读 - 所有人都可以读
  49.     public Object get(String key){
  50.         rwLock.readLock().lock();
  51.         Object o = null;
  52.         try {
  53.             System.out.println(Thread.currentThread().getName()+":"+key+"开始读取");
  54.             o = cache.get(key);
  55.             System.out.println(Thread.currentThread().getName()+":"+key+"读取完成");
  56.         }catch (Exception e){
  57.             e.printStackTrace();
  58.         }finally {
  59.             rwLock.readLock().unlock();
  60.         }
  61.         return o;
  62.     }
  63. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表