• MemoryCache 缓存 实用


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

    1. import java.util.ArrayList;
    2. import java.util.HashMap;
    3. /**
    4. * Description: [MemoryCache 缓存]
    5. *

    6. *
    7. * @author xx
    8. */
    9. public class MyMemoryCache<E> {
    10. // 使用volatile关键字确保多线程环境下的正确可见性
    11. private static volatile MyMemoryCache instance;
    12. // 缓存数据的Map
    13. private HashMap<String, ArrayList<E>> cache;
    14. // 私有构造方法,防止外部实例化
    15. private MyMemoryCache() {
    16. this.cache = new HashMap<>();
    17. }
    18. // 提供一个公共的静态方法获取单例
    19. public static MyMemoryCache getInstance() {
    20. // 第一次检查,如果instance为null,才进入同步代码块
    21. if (instance == null) {
    22. synchronized (MyMemoryCache.class) {
    23. // 第二次检查,确保只有一个线程创建实例
    24. if (instance == null) {
    25. instance = new MyMemoryCache<>();
    26. }
    27. }
    28. }
    29. return instance;
    30. }
    31. /**
    32. * 每次添加数据时,如果键已存在则将新对象添加到对应的列表中,否则创建新的列表并添加对象
    33. * @param key
    34. * @param value
    35. */
    36. public void put(String key, E value) {
    37. ArrayList<E> list;
    38. if (cache.containsKey(key)) {
    39. list = cache.get(key);
    40. } else {
    41. list = new ArrayList<>();
    42. }
    43. list.add(value);
    44. cache.put(key, list);
    45. }
    46. /**
    47. * 获取key 全部数据并删除缓存中key数据
    48. * @return
    49. */
    50. public ArrayList<E> getKeyValuesAndClear(String key) {
    51. ArrayList<E> allData = cache.get(key);
    52. cache.remove(key);
    53. return allData;
    54. }
    55. /**
    56. * 获取全部数据并删除缓存中数据
    57. * @return
    58. */
    59. public HashMap<String, ArrayList<E>> getAllAndClear() {
    60. HashMap<String, ArrayList<E>> allData = new HashMap<>(cache);
    61. cache.clear();
    62. return allData;
    63. }
    64. }

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

  • 相关阅读:
    <C++>初识STL —— 标准模板库
    Linux 如何查看磁盘空间
    ARM cortex-A7核UART实验 收发数据
    基于java小型银行管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
    977. Squares of a Sorted Array
    申请专利这10个知识点一定要知道哦
    Worthington酶促细胞收获&细胞粘附和收获
    NC Cloud uploadChunk文件上传漏洞复现
    【开源】基于Vue和SpringBoot的微信小程序的音乐平台
    189. 轮转数组
  • 原文地址:https://blog.csdn.net/ck3345143/article/details/141015321