gpt4 book ai didi

java - 使用并发 HashMap 时结果不一致

转载 作者:行者123 更新时间:2023-12-01 19:34:14 26 4
gpt4 key购买 nike

I have a class Counter that has multiple endpoints. I want to retain the number of "visits" for each endpoint. The endpoints can be accessed from different threads and I decided to use ConcurrentHashMap.

这是我的代码,我创建了一个模拟此行为的类:

public class Counter {

Map<String, Integer> endpoints = new ConcurrentHashMap<>();

void load(String endpoint) {

endpoints.put(endpoint, endpoints.get(endpoint) + 1);
}

void accessEndpoint(String endpoint, int times, int numberOfThreads) throws InterruptedException {

ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);

for (int i = 0; i < times; i++) {
executor.submit(() -> load(endpoint));
}

executor.shutdown();
executor.awaitTermination(1, TimeUnit.MINUTES);

}

public static void main(String[] args) throws InterruptedException {

Counter counter = new Counter();
counter.endpoints.put("www.google.com", 2);
counter.accessEndpoint("www.google.com", 100, 10);
System.out.println(counter.endpoints.get("www.google.com"));
}
}

输出不一致。

预期:102

实际:95、100、102、66、100

最佳答案

endpoints.put(endpoint, endpoints.get(endpoint) + 1); 不是原子操作。因此,两个线程可以 get() 相同的数字(例如 100),并相同的数字(101),从而使两次调用算作一次。

使用compute()代替,它是原子的:

endpoints.compute(endpoint, (k,v)-> v+1);

或者如果您想始终从零开始而不进行初始化。

endpoints.merge(endpoint, 1, Integer::sum);

关于java - 使用并发 HashMap 时结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58428769/

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