gpt4 book ai didi

java - 使用并发 HashMap 时锁的必要性

转载 作者:行者123 更新时间:2023-12-02 10:05:15 26 4
gpt4 key购买 nike

这是我的一个类(class)中的代码:

 class SomeClass {

private Map<Integer, Integer> map = new ConcurrentHashMap<>();
private volatile int counter = 0;
final AtomicInteger sum = new AtomicInteger(0); // will be used in other classes/threads too
private ReentrantLock l = new ReentrantLock();

public void put(String some) {
l.lock();
try {
int tmp = Integer.parseInt(some);
map.put(counter++, tmp);
sum.getAndAdd(tmp);
} finally {
l.unlock();
}
}

public Double get() {
l.lock();
try {
//... perform some map resizing operation ...
// some calculations including sum field ...
} finally {
l.unlock();
}
}

}

您可以假设此类将在并发环境中使用。

问题是:你觉得锁的必要性如何?这段代码味道如何? :)

最佳答案

让我们看看public void put(String some)内部的操作。

  1. map.put(counter++, tmp);
  2. sum.getAndAdd(tmp);

现在让我们看看各个部分。

  1. counter 是一个 volatile 变量。所以它只提供内存可见性,但不提供原子性。由于 counter++ 是复合操作,因此需要锁来实现原子性。

  2. map.put(key, value) 是原子的,因为它是一个 ConcurrentHashMap

  3. sum.getAndAdd(tmp) 是原子的,因为它是 AtomicInteger

如您所见,除了 counter++ 之外,所有其他操作都是原子操作。然而,你试图通过组合所有这些操作来实现某些功能。要在功能级别实现原子性,您需要锁。当线程在各个原子操作之间交错时,这将帮助您避免令人惊讶的副作用。

因此您需要一个锁,因为 counter++ 不是原子的,并且您希望组合一些原子操作来实现某些功能(假设您希望这是原子的)。

关于java - 使用并发 HashMap 时锁的必要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55375557/

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