温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java不可变缓存怎么实现

发布时间:2026-10-22 09:34:39 来源:亿速云 阅读:87 作者:小樊 栏目:编程语言

在 Java 中,“不可变缓存(Immutable Cache)”通常指缓存对象本身不可修改,一旦创建就不能被更改,从而保证线程安全、避免并发问题。下面从设计思路、常见实现方式、示例代码三个层面说明。


一、核心设计思路

不可变缓存的关键点:

  1. 缓存容器不可变
    • 使用 final 修饰
    • 使用不可变集合(如 List.of、Map.of、Collections.unmodifiableXXX)
  2. 缓存中的值不可变
    • 值对象本身也是不可变类(无 setter、字段 final)
  3. 写操作返回新缓存,而不是修改旧缓存
    • 类似函数式编程思想

二、常见实现方式

方式 1:使用 Java 不可变集合(推荐)

public final class ImmutableCache {
    private final Map<String, String> cache;

    public ImmutableCache(Map<String, String> data) {
        this.cache = Map.copyOf(data); // Java 9+
    }

    public String get(String key) {
        return cache.get(key);
    }

    // 返回新的缓存,而不是修改原缓存
    public ImmutableCache put(String key, String value) {
        Map<String, String> newMap = new HashMap<>(cache);
        newMap.put(key, value);
        return new ImmutableCache(newMap);
    }
}

✅ 优点:

  • 线程安全
  • 实现简单
  • 无锁

方式 2:使用 Collections.unmodifiableMap

public class ImmutableCache {
    private final Map<String, String> cache;

    public ImmutableCache(Map<String, String> data) {
        this.cache = Collections.unmodifiableMap(
            new HashMap<>(data)
        );
    }

    public String get(String key) {
        return cache.get(key);
    }
}

⚠️ 注意:

  • 只是“视图不可变”
  • 原始 HashMap 仍可能被外部引用修改

方式 3:值对象也不可变(重要)

public final class CacheValue {
    private final int code;
    private final String desc;

    public CacheValue(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public int getCode() { return code; }
    public String getDesc() { return desc; }
}

方式 4:结合 volatile + 不可变缓存(高性能读)

public class SafeCache {
    private volatile ImmutableCache cache =
            new ImmutableCache(Map.of());

    public String get(String key) {
        return cache.get(key);
    }

    public void update(String key, String value) {
        cache = cache.put(key, value);
    }
}

✅ 适合:

  • 读多写少
  • 高并发场景

三、典型使用场景

  • 配置缓存
  • 字典表
  • 路由规则
  • 只读元数据

四、总结

特性 不可变缓存
线程安全 ✅
是否需要锁 ❌
写代价 较高(新建对象)
适合场景 读多写少

如果你有具体场景(如:高并发、本地缓存、分布式),我可以给你更合适的实现方案。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手