当前位置: 首页 > article >正文

系列十、ReentrantReadWriteLock

一、概述

ReentrantReadWriteLock是ReadWriteLock的一个子类,具有读锁和写锁的双重功能,通常用于做缓存。

二、案例代码

2.1、ReentrantReadWriteLockCache

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/20 17:57
 * @Description: 使用ReentrantReadWriteLock实现缓存的功能
 */
public class ReentrantReadWriteLockCache {

    private volatile Map<String, Object> map = new HashMap<>();
    private ReadWriteLock rwLock = new ReentrantReadWriteLock();

    /**
     * 写数据
     * @param key
     * @param value
     */
    public void put(String key, Object value) {
        rwLock.writeLock().lock();
        try {
            System.out.println(Thread.currentThread().getName() + "\t正在写" + key);
            // 线程休眠,单位:毫秒
            try {TimeUnit.MILLISECONDS.sleep(300);} catch (Exception e) {e.printStackTrace();}
            map.put(key, value);
            System.out.println(Thread.currentThread().getName() + "\t写完了" + key);
            System.out.println();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            rwLock.writeLock().unlock();
        }
    }

    /**
     * 读数据
     * @param key
     * @return
     */
    public Object get(String key) {
        rwLock.readLock().lock();
        Object result = null;
        try {
            System.out.println(Thread.currentThread().getName() + "\t正在读" + key);
            // 线程休眠,单位:毫秒
            try {TimeUnit.MILLISECONDS.sleep(300);} catch (Exception e) {e.printStackTrace();}
            result = map.get(key);
            System.out.println(Thread.currentThread().getName() + "\t读完了" + result);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            rwLock.readLock().unlock();
        }

        return result;
    }
}

2.2、ReentrantReadWriteLockMainApp

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/20 18:00
 * @Description:
 */
public class ReentrantReadWriteLockMainApp {

    public static void main(String[] args) {
        ReentrantReadWriteLockCache cache = new ReentrantReadWriteLockCache();

        for (int i = 1; i <= 5; i++) {
            final int number = i;
            new Thread(() -> {
            	try {
            		cache.put(String.valueOf(number),number);
            	} catch (Exception e) {
            		e.printStackTrace();
            	}
            }, String.valueOf(i)).start();
        }

        for (int i = 1; i <= 5; i++) {
            final int number = i;
            new Thread(() -> {
                try {
                    cache.get(String.valueOf(number));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }, String.valueOf(i)).start();
        }
    }

}


http://www.kler.cn/news/135017.html

相关文章:

  • Ubuntu 安装VMware Tools选项显示灰色,如何安装VMware Tools
  • 红海营销时代,内容占位的出海品牌更有机会营销占位
  • 探讨MySQL存储过程返回记录集
  • JSON 格式的接口测试流程【Eolink Apikit】
  • 推荐一个windows上传linux服务器/linux服务器的docker镜像的工具,摆脱docker cp,以及解决常见问题。
  • C#的WebRequest类
  • selenium
  • 达芬奇DaVinci Resolve Studio 18.6.3 for Mac
  • 三、机器学习基础知识:Python常用机器学习库(图像处理相关库)
  • Qt的委托代理机制
  • gRPC 四模式之 双向流RPC模式
  • 安全加速cdn可以起到什么作用?
  • Docker中的RabbitMQ已经启动运行,但是管理界面打不开
  • 36、Flink 的 Formats 之Parquet 和 Orc Format
  • 【Python百宝箱】图解未来:数据可视化引领智慧决策时代
  • 15.ORACLE11g的归档方式和日志文件的相关操作
  • 十八数藏文化创新助力非遗传承:传统之美在数字创新中闪耀
  • 计算3D目标框的NMS
  • Nginx 413 Request Entity Too Large
  • 使用centos搭建内网的yum源
  • 【最新Tomcat】IntelliJ IDEA通用配置Tomcat教程(超详细)
  • JDY蓝牙注意事项
  • 高精度算法【Java】(待更新中~)
  • 【以图会意】操作系统的加载流程
  • 【Linux】C文件系统详解(四)——磁盘的物理和抽象结构
  • Bert浅谈
  • vue使用本地图片设置为默认图
  • 【Django使用】django经验md文档10大模块。第4期:Django数据库增删改查
  • 整形数据和浮点型数据在内存中的存储差别
  • 微服务调用链路追踪