我有一个共享的全局计数器,在进行并发计算并更新到映射之前,我要检查该计数器是否小于总数。如何使用现代的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);
}
}
}
答案 0 :(得分:1)
现代Java仍使用相同的线程安全基本原理。您有一个 check-then-act 场景,该场景几乎涵盖了整个方法。因此,您可以使方法synchronized
:
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
。