ToB企服应用市场:ToB评测及商务社交产业平台

标题: JUC并发编程学习笔记(八)读写锁 [打印本页]

作者: 慢吞云雾缓吐愁    时间: 2023-12-4 15:17
标题: JUC并发编程学习笔记(八)读写锁
读写锁

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. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4