当前位置: 首页 > 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/a/135017.html

相关文章:

  • 【专题】计算机网络之网络层
  • MySQL重难点(一)索引
  • ReactPress技术揭秘
  • 区块链技术在电子政务中的应用
  • 【Linux】进程池实现指南:掌控并发编程的核心
  • 物联网(RFID)全景:被装信息化监控应用与挑战
  • 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源