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

读写锁

ReadWriteLock

ReadWriteLock只存在一个实现类那就是ReentrantReadWriteLock,他可以对锁实现更加细粒化的控制

读的时候可以有多个阅读器线程同时参与,写的时候只希望写入线程是独占的

Demo:

java 复制代码
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;
    }
}
相关推荐
一只程序熊4 分钟前
vite-cool-unix-ctx] Unexpected token l in JSON at position 0
java·服务器·前端
晨晖29 分钟前
idea2017的下载,破解及使用
java·ide·intellij-idea
摇滚侠18 分钟前
Java 项目教程《黑马商城-MQ 篇》,分布式架构项目,从开发到部署
java·分布式·架构
Rsun0455123 分钟前
文件类型后缀汇总
java
小江的记录本39 分钟前
【Spring Boot—— .yml(YAML)】Spring Boot中.yml文件的基础语法、高级特性、实践技巧
xml·java·spring boot·后端·spring·spring cloud·架构
I_LPL42 分钟前
day52 代码随想录算法训练营 图论专题6
java·数据结构·算法·图论
2601_953465611 小时前
m3u8live.cn深度解析:一款专为开发者打造的 M3U8 调试工具
java·前端·django·音视频·开发工具
稻草猫.1 小时前
SpringBoot日志全解析:从调试到持久化
java·开发语言·spring boot·java-ee·idea
zopple1 小时前
Knife4j文档请求异常(基于SpringBoot3,查找原因并解决)
java·服务器·数据库
清水白石0081 小时前
Python 弱引用深度解析——让缓存不再成为内存泄漏的温床
java·python·缓存