慢吞云雾缓吐愁 发表于 2023-12-4 15:17:04

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

读写锁

ReadWriteLock
ReadWriteLock只存在一个实现类那就是ReentrantReadWriteLock,他可以对锁实现更加细粒化的控制
读的时候可以有多个阅读器线程同时参与,写的时候只希望写入线程是独占的
https://img2023.cnblogs.com/blog/3034026/202311/3034026-20231102181400352-651971577.png
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;
    }
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: JUC并发编程学习笔记(八)读写锁