gpt4 book ai didi

java - 如何将 ConcurrentHashMap.merge() 与共享 AtomicInteger 结合使用

转载 作者:行者123 更新时间:2023-12-02 09:50:29 25 4
gpt4 key购买 nike

我有一个共享的全局计数器,我想在进行并发计算和更新到映射之前检查它是否小于总数。我如何使用现代 java 并发 utils/API 来确保这是原子的?


class SharedAccess {

AtomicInteger globalCounter = new AtomicInterger();
Map<String, Integer> counterPerKey = new ConcurrentHashMap<>()

class Holder{
Integer value
}

public Holder incrementForKeyMultipleThreads(String key) {
if (total.get() < 1000) {

Integer newTotal = counterPerKey.merge(key, 1, Integer::sum);
globalCounter.increment();
return new Holder(newTotal);

}

}

}

编辑:这是通过合并函数实际上也是原子的来解决的。因此,您可以获得对映射其余部分的多线程访问以及总计数器上的原子增量的好处。


class SharedAccess {

AtomicInteger globalCounter = new AtomicInterger();
Map<String, Integer> counterPerKey = new ConcurrentHashMap<>()

class Holder{
Integer value
}

public Holder incrementForKeyMultipleThreads(String key) {
if (total.get() < 1000) {

Integer newTotal = counterPerKey.merge(key, 1, (v1, v2) -> {
globalCounter.increment();
return v1+v1;
}

return new Holder(newTotal);

}

}

}

最佳答案

现代java仍然使用相同的线程安全基本原则。您有一个检查然后执行场景,它几乎涵盖了整个方法。因此,您可以使方法同步:

public synchronized Holder incrementForKeyMultipleThreads(String key) {
if (globalCounter.get() < 1000) {
globalCounter.increment();
return new Holder(counterPerKey.merge(key, 1, Integer::sum));
}
return null;
}

如果这是您唯一使用(读取或写入)globalCounter 的地方,您可以将其更改为 int

关于java - 如何将 ConcurrentHashMap.merge() 与共享 AtomicInteger 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56351890/

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