gpt4 book ai didi

java - AtomicLongMap 读取线程安全

转载 作者:行者123 更新时间:2023-11-30 07:12:38 26 4
gpt4 key购买 nike

我有以下类(class):

public class Storage {
protected static final AtomicLongMap<String> MAP;
protected Storage () {
MAP= AtomicLongMap.create();
}

public void decrement(String id) {
long num = MAP.get(id);
if (num != 0) {
MAP.decrementAndGet(id);
}
}

public void putIntoActiveAgents(String id, Integer num) {
MAP.put(id, num);
}

public void remove(String id) {
MAP.remove(id);
}

public Long get(String id) {
return MAP.get(ID);
}
}

就我而言,我假设有 6 个线程正在执行类似的操作:每个线程检查map中的long是否等于1,如果不等于1,则调用decrement,如果是,则调用remove。我到处都读到 AtomicLongMap 是线程安全的。我确信,当有人递增/递减长数字时,但我不确定当其他线程从该映射中读取值时它是否仍然是线程安全的。我的场景:1. 线程 A 从映射中读取值 - 它是 2(因此它递减该值)2. 线程 B 在计数器递减之前读取值 - 它仍然返回 2,因此它也会递减值。3. 结果,没有人看到设置为 1 的值。

我的问题是在这种情况下,我需要同步MAP吗?

最佳答案

如果您使用的是 Java 8,查看您的代码,我建议您使用 ConcurrentHashMap。 Java 8 中的 Map 接口(interface)已更新为新函数,例如computeIfPresent()。所以你的函数“decrement(String id)”看起来像这样 -

public class Storage {
protected static final Map<String, Long> MAP = new ConcurrentHashMap<>();

public void decrement(String id) {
MAP.computeIfPresent(id, (id, currentValue) -> --currentValue);
}

public void putIntoActiveAgents(String id, Integer num) {
MAP.put(id, num);
}

public void remove(String id) {
MAP.remove(id);
}

public Long get(String id) {
return MAP.get(ID);
}
}

关于java - AtomicLongMap 读取线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38957175/

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