gpt4 book ai didi

java - 重新加载同时具有并发读取器的多个缓存

转载 作者:行者123 更新时间:2023-11-30 08:41:14 25 4
gpt4 key购买 nike

我使用多个 HashMap 将引用数据存储在一个类中

Map map1;
Map map2;
Map map3;

它们被多个读者同时访问。我想同时重新初始化它们。如果它是一张 map ,我可以做

public void reload(){
map1 = createNewMapWithLatestData();
}

由于现有读者有旧引用,新读者有新引用,所以工作正常。但是因为我有多个 map ,所以新读者可能会得到最新版本的 map1map2 但旧版本的 map3,因为替换操作不是原子的。

好的,所以我需要锁定它,这让我想到了我的问题。除了使用 synchronized 锁定所有内容之外,还有什么优雅的方法可以做到这一点?

我只在重新加载实际发生时才需要锁,其他时候不需要。我查看了 java locks(Read write)、Conditions、CyclicBarriers、Countdownlatches 等,但不确定什么是正确的方法。

最佳答案

如果您创建新 map ,那么无论如何读者都需要有一种方法来获取新 map 的引用。因此,不是直接引用 mapX,而是保留对包含所有 map 的对象的引用。就像您在示例中所做的那样,您只需分配新对象的引用即可自动替换它。您将在每个地方使用 holder.map1,而不是使用 map1。

class Holder {
Map map1;
Map map2;
}

class Reader {
Holder holder;
void read() {
writer.getHolder().map1.get("x");
}
}

class Writer {
Holder holder;
Holder getHolder() {
return holder;
}
void reload() {
Holder newHolder = new Holder();
newHolder.map1 = createNewMap1WithLatestData();
newHolder.map2 = createNewMap2WithLatestData();
holder = newHolder; // this is atomic
}
}

关于java - 重新加载同时具有并发读取器的多个缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35210943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com