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)确保了即使在多线程环境下也只会创建一个实例,并且提高了性能,因为只有在第一次实例化时才需要进入同步代码块。
相关文章:
MemoryCache 缓存 实用
MemoryCache 缓存 实用,相关逻辑代码里已详细注释, 在Java中创建一个单例模式(Singleton Pattern)的MyMemoryCache类,可以采用多种方法,其中最常见的是使用“饿汉式”和“懒汉式”(线程安全和非线程安全&am…...
Java设计模式(命令模式)
定义 将一个请求封装为一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。 角色 抽象命令类(Command):声明用于执行请求的execute方法,通…...
什么是 CI/CD?
什么是 CI/CD? CI/CD(Continuous Integration/Continuous Deployment)是一种软件开发实践,旨在通过自动化的方式频繁地构建、测试和发布软件。CI/CD 可以显著提高软件交付的速度和质量,使团队能够更快地响应市场变化和…...
【免费】最新区块链钱包和私钥的助记词碰撞器,bybit使用python开发
使用要求 1、用的是google里面的扩展打包成crx文件,所以在使用之前你需要确保自己电脑上有google浏览器,而且google浏览器版本需要在124之上。(要注意一下,就是电脑只能有一个Chrome浏览器) 2、在win10上用vscode开发…...
【苍穹外卖JAVA项目】第2天:新增员工
在EmployeeMapper.java中插入数据:一、新增员工 1.产品原型 2.接口设计 由于需要提交员工信息,用post请求方式,可以携带json数据 3.设计数据库的employee表 4.设计DTO 数据传输对象(DTO):封装前端提交过…...
队列的实现及循环队列
一、队列的概念及结构 队列只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列具有先进先出FIFO(Fist In First Out)。 入队列:进行插入操作的一端称为队尾。 出队列:进行删除操作的一端称为…...
docker部署zookeeper和kafka
docker部署zookeeper和kafka zookeeperkafkakafka-eagle zookeeper firewall-cmd --zonepublic --add-port2181/tcp --permanent firewall-cmd --reload docker pull zookeeper:3.4.14 docker run -d --name zk -p 2181:2181 zookeeper:3.4.14mkdir -p /root/zookeeper/data m…...
(13)zabbix的监控-1
前言:在上一次的基础上,完成实验。 1、添加一个空模板,方便 2、添加空模板到主机192.168.121.50 client-one里面模板是空的 4、在主机添加监控项和图形 5、自定义监控项,在客户端定义 [rootclient1 ~]# vim /etc/zabbix/zabbix_…...
Redis相关面试题(二)
一、Bit中不同命令使用的场景 二、什么是缓存击穿,缓存穿透,缓存雪崩? 缓存击穿:是指当某一个key的缓存过期时大并发量的请求同时访问key,瞬间击穿服务器直接访问到数据库,使得数据库处于负载情况 缓存穿透…...
Docker Compose与私有仓库
Docker Compose与私有仓库 docker-compose -v 查看版本信息 Docker Compose的应用 创建APACHE容器 vim docker-compose.yaml yaml文件缩进严格;冒号后有内容需要加空格,冒号后无内容一般不加空格 冒号后的内容中若包含路径‘/’或‘:’时…...
AI学习记录 - gpt如何进行token化,理论知识,以GPT2为举例
AI学习记录已经发了十几篇,大佬们可以看看,如果有帮助动动小手点赞 token入门版,有空会更新具体代码操作 GPT4当中,我们提问问题是按照token进行扣费的,那到底什么是token? 在不同的语言模型当中&#x…...
Java线程池和执行流程
在 Java 中,常见的四种线程池包括: 1. newFixedThreadPool(固定大小线程池) 应用场景:适用于需要限制线程数量,并且任务执行时间比较均匀的场景,例如服务器端的连接处理。优点:线程数…...
进程信号的产生与处理
目录 前言 一.信号的概念 二.信号的产生 1.键盘产生 2.系统调用 3.软件条件 4.异常 三.信号的保存 四.信号的处理 信号处理的方式 设定屏蔽信号 自定义处理信号 信号处理的时机 前言 进程信号(Process Signals)是操作系统与运行进程之间进行通…...
统一响应结果封装,Result类的实现【后端 06】
统一响应结果封装,Result类的实现 在开发Web应用或API接口时,如何优雅地处理并返回响应结果是每个开发者都需要考虑的问题。统一响应结果封装(Unified Response Encapsulation)作为一种广泛采用的实践,不仅提高了API的…...
明日周刊-第20期
本周异形新电影上映,开始期待起来了,毕竟这是一个经久不衰的ip。还有就是马上来临的黑神话悟空,属于我们自己的3A大作,接下去的每一天都是新的期待。 文章目录 科技短讯资源分享随便说说一点心情 科技短讯 科技创新与突破 人工智…...
深入剖析 Spring 常用注解:功能与差异的全景洞察
《深入剖析 Spring 常用注解:功能与差异的全景洞察》 在当今的 Java 开发领域,Spring 框架无疑是最广泛使用的框架之一。而在 Spring 中,注解的运用极大地简化了开发流程,提高了代码的可读性和可维护性。本文将深入探讨 Spring 中…...
【隐私计算篇】隐私计算使用不当也会泄露原始数据
1. 背景信息 有个有趣的问题,刚好最近有讨论到,在这里也抛一下,就是隐私计算中我们经常谈到主流的一些技术,比如联邦学习、多方安全计算、安全求交、匿踪查询、可信执行环境等,然后笼统地会称这些技术实现了对隐私…...
C++第一讲:开篇
C第一讲:开篇 1.C历史背景1.1C创世主--本贾尼1.2C版本更新1.3C的重要性1.4C书籍推荐 2.C的第一个程序3.命名空间3.1namespace是什么3.2namespace的使用3.3namespace使用注意事项3.4命名空间的使用 4.C输入和输出5.缺省参数6.函数重载7.引用7.1什么是引用7.2引用的定…...
OceanBase V4.2特性解析:MySQL模式下GIS空间表达式的场景及能力解析
1. 背景 1.1. OceanBase Mysql gis空间表达式的应用场景及能力 在OceanBase 4.1版本中,mysql模式下支持了gis数据类型以及部分空间对象相关的表达式,随着客户使用空间数据的需求日益增长,需要快速地补齐空间数据存储和计算分析的能力&#…...
HSL模型和HSB模型,和懒人配色的Color Hunt
色彩不仅仅是视觉上的享受,它在数据可视化中也扮演着关键角色。通过合理运用色彩模型,我们可以使数据更具可读性和解释性。在这篇文章将探讨HSL(Hue, Saturation, Lightness)和HSB(Hue, Saturation, Brightness&#x…...
dp动规 - 水质检测
题目 题目分析 有两行水质检测器,每一行的长度皆为n,现在的目的就是要让检测器之间联通,求至少需要多添加几台水质检测器? 思路梳理 错误思路 看到有图的时候,这道题我第一个思路想到了用BFS,观察测试用…...
Harnessing Claude 打造高效、低成本、可进化的 AI 应用
在 AI 技术飞速迭代的今天,Anthropic 联合创始人 Chris Olah 的一句话道出了生成式 AI 的本质:Claude 这类大模型不是被 “搭建” 出来的,而是被 “培育” 成长的。研究人员设定成长规则,却无法精准预判它会涌现出怎样的能力。这给…...
如何用树莓派CM5边缘计算机快速搭建你自己的工业AI实验平台
在工业自动化和智能制造的浪潮中,各类工业设备(如机器人、PLC、传感器、AGV等)如同不知疲倦的“产业工人”,构成了现代工厂的流动血脉。然而,驱动这些设备高效、有序工作的核心——“大脑”即边缘计算与控制系统&#…...
SDMatte商业级抠图案例展示:电商平台海量商品图处理实录
SDMatte商业级抠图案例展示:电商平台海量商品图处理实录 1. 开篇:当AI抠图遇上电商实战 电商平台每天要处理成千上万的商品图片,从服装模特到珠宝首饰,每张图都需要完美的展示效果。传统人工抠图不仅成本高,面对促销…...
Qwen3.5-9B-AWQ-4bit赋能Android Studio:移动端AI功能原型开发
Qwen3.5-9B-AWQ-4bit赋能Android Studio:移动端AI功能原型开发 1. 移动端AI开发的新机遇 最近在Android开发社区里,越来越多的开发者开始尝试将大模型能力集成到移动应用中。Qwen3.5-9B-AWQ-4bit模型的出现,为移动端AI功能开发带来了新的可…...
SEO原创文章的发布频率应该如何确定
SEO原创文章的发布频率应该如何确定 在当今的互联网时代,搜索引擎优化(SEO)已经成为网站运营的关键环节之一。为了在百度上获得更好的排名,发布高质量的原创文章是必不可少的策略。如何确定SEO原创文章的发布频率,是许…...
如何分析网站SEO关键词排名
如何分析网站SEO关键词排名 在当今的互联网时代,网站的SEO(搜索引擎优化)已经成为了提升网站流量和提高品牌知名度的重要手段之一。其中,关键词排名分析是SEO工作的核心环节。一个网站如果能够在搜索引擎上的关键词排名靠前&…...
GridPlayer:多视频同步播放的终极解决方案
GridPlayer:多视频同步播放的终极解决方案 【免费下载链接】gridplayer Play videos side-by-side 项目地址: https://gitcode.com/gh_mirrors/gr/gridplayer 在数字内容爆炸的时代,视频创作者、教育工作者和媒体分析师经常面临需要同时处理多个视…...
Rust内存管理与安全:告别内存泄漏和空指针
Rust内存管理与安全:告别内存泄漏和空指针 后端转 Rust 的萌新,ID "第一程序员"——名字大,人很菜(暂时)。正在跟所有权和生命周期死磕,日常记录 Rust 学习路上的踩坑经验和"啊哈时刻"…...
C++的std--ranges适配器视图迭代器有效性保证与悬垂引用检测
C20引入的std::ranges库彻底改变了序列操作的范式,其中适配器视图(如filter、transform)通过惰性求值实现了高效的管道式编程。这种延迟执行特性也带来了迭代器有效性风险——视图可能持有悬垂引用或失效迭代器,导致未定义行为。本…...
