gpt4 book ai didi

java - 如何在多线程应用程序中自动更新ConcurrentMap的值?

转载 作者:行者123 更新时间:2023-12-01 09:07:41 25 4
gpt4 key购买 nike

我有一个 ConcurrentMap,我需要从多线程应用程序填充它。我的 map 如下所示:

  private final ConcurrentMap<String, AtomicLongMap<String>> deviceErrorHolder = Maps.newConcurrentMap();

下面是我的方法,它是从多线程应用程序以非常快的速度调用的,因此我需要确保它很快。

  public void addDeviceErrorStats(String deviceName, String errorName) {
AtomicLongMap<String> errorMap = deviceErrorHolder.get(deviceName);
if (errorMap == null) {
errorMap = AtomicLongMap.create();
AtomicLongMap<String> currenttErrorMap = deviceErrorHolder.putIfAbsent(deviceName, errorMap);
if (currenttErrorMap != null) {
errorMap = currenttErrorMap;
}
}
errorMap.incrementAndGet(errorName);
}

对于每个 deviceName,我将有一个 AtomicLongMap,其中包含不同 errorName 的所有计数。

  ExceptionCounter.getInstance().addDeviceErrorStats("deviceA", "errorA");
ExceptionCounter.getInstance().addDeviceErrorStats("deviceA", "errorB");
ExceptionCounter.getInstance().addDeviceErrorStats("deviceA", "errorC");

ExceptionCounter.getInstance().addDeviceErrorStats("deviceB", "errorA");
ExceptionCounter.getInstance().addDeviceErrorStats("deviceB", "errorB");

我的 addDeviceErrorStats 方法线程安全吗?而且我更新 deviceErrorHolder map 值的方式是否正确?这意味着这将是一个原子操作吗?我是否需要同步创建新的 AtomicLongMap 实例?或者 CM 会帮我处理这个吗?

我正在使用 Java7。

最佳答案

您可以使用 computeIfAbsent() 创建一个很多更简单的版本。

AtomicLongMap<String> errorMap = deviceErrorHolder.computeIfAbsent(deviceName, a -> AtomicLongMap.create());
errorMap.incrementAndGet(errorName);

computeIfAbsent(在并发映射中)特别适用于执行 null 检查逻辑的原子版本。如果 deviceName 键有值,则返回该值,否则以原子方式调用计算,并且计算的返回值既与映射中的键关联又返回。

关于java - 如何在多线程应用程序中自动更新ConcurrentMap的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41135998/

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