怎么发布php网站,wordpress产品系统,怎么做一个网址链接,相册制作MemoryCache 缓存 实用,相关逻辑代码里已详细注释#xff0c;
在Java中创建一个单例模式#xff08;Singleton Pattern#xff09;的MyMemoryCache类#xff0c;可以采用多种方法#xff0c;其中最常见的是使用“饿汉式”和“懒汉式”#xff08;线程安全和非线程安全
在Java中创建一个单例模式Singleton Pattern的MyMemoryCache类可以采用多种方法其中最常见的是使用“饿汉式”和“懒汉式”线程安全和非线程安全的方法。这里我将向你展示一个线程安全的“懒汉式”实现使用双重检查锁定double-checked locking来确保线程安全和性能。
直接上代码。 import java.util.ArrayList;
import java.util.HashMap;/*** Description: [MemoryCache 缓存]* /p** author xx*/
public class MyMemoryCacheE {// 使用volatile关键字确保多线程环境下的正确可见性private static volatile MyMemoryCache instance;// 缓存数据的Mapprivate HashMapString, ArrayListE 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) {ArrayListE list;if (cache.containsKey(key)) {list cache.get(key);} else {list new ArrayList();}list.add(value);cache.put(key, list);}/*** 获取key 全部数据并删除缓存中key数据* return*/public ArrayListE getKeyValuesAndClear(String key) {ArrayListE allData cache.get(key);cache.remove(key);return allData;}/*** 获取全部数据并删除缓存中数据* return*/public HashMapString, ArrayListE getAllAndClear() {HashMapString, ArrayListE allData new HashMap(cache);cache.clear();return allData;}
}
上述代码中MyMemoryCache类通过私有构造函数和getInstance方法实现了单例模式。volatile关键字确保了在多线程环境中instance变量的写操作对其他线程是可见的。双重检查锁定DCL确保了即使在多线程环境下也只会创建一个实例并且提高了性能因为只有在第一次实例化时才需要进入同步代码块。