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

MemoryCache 缓存 实用

MemoryCache 缓存 实用,相关逻辑代码里已详细注释,
在Java中创建一个单例模式(Singleton Pattern)的MyMemoryCache类,可以采用多种方法,其中最常见的是使用“饿汉式”和“懒汉式”(线程安全和非线程安全)的方法。这里,我将向你展示一个线程安全的“懒汉式”实现,使用双重检查锁定(double-checked locking)来确保线程安全和性能。
直接上代码。


import java.util.ArrayList;
import java.util.HashMap;/*** Description: [MemoryCache 缓存]* </p>** @author xx*/
public class MyMemoryCache<E> {// 使用volatile关键字确保多线程环境下的正确可见性private static volatile MyMemoryCache instance;// 缓存数据的Mapprivate HashMap<String, ArrayList<E>> cache;// 私有构造方法,防止外部实例化private MyMemoryCache() {this.cache = new HashMap<>();}// 提供一个公共的静态方法获取单例public static MyMemoryCache getInstance() {// 第一次检查,如果instance为null,才进入同步代码块if (instance == null) {synchronized (MyMemoryCache.class) {// 第二次检查,确保只有一个线程创建实例if (instance == null) {instance = new MyMemoryCache<>();}}}return instance;}/*** 每次添加数据时,如果键已存在则将新对象添加到对应的列表中,否则创建新的列表并添加对象* @param key* @param value*/public void put(String key, E value) {ArrayList<E> list;if (cache.containsKey(key)) {list = cache.get(key);} else {list = new ArrayList<>();}list.add(value);cache.put(key, list);}/*** 获取key 全部数据并删除缓存中key数据* @return*/public ArrayList<E> getKeyValuesAndClear(String key) {ArrayList<E> allData = cache.get(key);cache.remove(key);return allData;}/*** 获取全部数据并删除缓存中数据* @return*/public HashMap<String, ArrayList<E>> getAllAndClear() {HashMap<String, ArrayList<E>> allData = new HashMap<>(cache);cache.clear();return allData;}
}

上述代码中,MyMemoryCache类通过私有构造函数和getInstance方法实现了单例模式。volatile关键字确保了在多线程环境中,instance变量的写操作对其他线程是可见的。双重检查锁定(DCL)确保了即使在多线程环境下也只会创建一个实例,并且提高了性能,因为只有在第一次实例化时才需要进入同步代码块。

http://www.lryc.cn/news/421393.html

相关文章:

  • Java设计模式(命令模式)
  • 什么是 CI/CD?
  • 【免费】最新区块链钱包和私钥的助记词碰撞器,bybit使用python开发
  • 【苍穹外卖JAVA项目】第2天:新增员工
  • 队列的实现及循环队列
  • docker部署zookeeper和kafka
  • (13)zabbix的监控-1
  • Redis相关面试题(二)
  • Docker Compose与私有仓库
  • AI学习记录 - gpt如何进行token化,理论知识,以GPT2为举例
  • Java线程池和执行流程
  • 进程信号的产生与处理
  • 统一响应结果封装,Result类的实现【后端 06】
  • 明日周刊-第20期
  • 深入剖析 Spring 常用注解:功能与差异的全景洞察
  • 【隐私计算篇】隐私计算使用不当也会泄露原始数据
  • C++第一讲:开篇
  • OceanBase V4.2特性解析:MySQL模式下GIS空间表达式的场景及能力解析
  • HSL模型和HSB模型,和懒人配色的Color Hunt
  • 什么是云原生?(二)
  • pytorch 47 模型剪枝实战|基于torch-pruning库代码对yolov10n模型进行剪枝
  • LeetCode_sql_day15(262.行程与用户)
  • 【MySQL】详解数据库约束、聚合查询和联合查询
  • bug积累
  • 版本控制案例:全球虚拟制片领导者Dimension借助Perforce Helix Core简化多供应商协作,控制访问权限,确保数据资产安全(下)
  • Anaconda配置envs和pcks路径
  • 推荐10个在线搭建框架平台
  • Linux Shell--函数
  • 漏洞复现-CVE-2023-42442:JumpServer未授权访问漏洞
  • 【数据结构之带头双向循环链表的实现】