如何通过共享的AtomicInteger使用ConcurrentHashMap.merge()

时间:2019-05-29 01:19:45

标签: java concurrency

我有一个共享的全局计数器,在进行并发计算并更新到映射之前,我要检查该计数器是否小于总数。如何使用现代的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);

    }

  }

}

1 个答案:

答案 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