gpt4 book ai didi

并发

转载 作者:行者123 更新时间:2023-11-29 07:48:16 28 4
gpt4 key购买 nike

我正在尝试在多线程环境中实现某种累积逻辑;我想知道没有 lock 和 synchronized 关键字是否有更好/更快的方法来做到这一点?以下是我当前的代码:

public class ConcurrentHashMapTest {

private static final int NB_THREADS = 1_000;

private final Map<String, Integer> cnts = new HashMap<>();

private static final Lock RWLOCK = new ReentrantLock(true);

private static final String[] NAMES = {
"A", "B"
};

public void testIt() {
ExecutorService executor =
Executors.newFixedThreadPool(NB_THREADS);
for (int i = 0; i < NB_THREADS; i++) {
Runnable task = new WorkerThread();
executor.submit(task);
}
executor.shutdown();
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println(cnts);
}

private void accumulate(String name) {
RWLOCK.lock();
try {
Integer cnt = cnts.get(name);
if (cnt == null) {
cnts.put(name, 1);
} else {
cnts.put(name, cnt + 1);
}
} finally {
RWLOCK.unlock();
}
}

private class WorkerThread implements Runnable {
@Override
public void run() {
accumulate(NAMES[ThreadLocalRandom.current().nextInt(0, NAMES.length)]);
}
}
}

最佳答案

Java 8:

private final Map<String, AtomicInteger> cnts =
new ConcurrentHashMap<>();

private void accumulate(String name) {
cnts.computeIfAbsent(name, k -> new AtomicInteger()).incrementAndGet();
}

ConcurrentHashMap 可以从多个线程自由访问。 computeIfAbsent 方法接受一个 lambda 表达式来求值,如果映射中不存在该键,则获取该键的值,当且仅当不存在这样的映射时才添加它,然后返回该值.它实际上是 putIfAbsent 后跟 get。该值是一个值为 0 的新 AtomicInteger。无论是否存在现有值,或者是否刚刚添加了一个值为 0 的新值,在任何一种情况下都会递增它。

Java 7:

private final ConcurrentMap<String, AtomicInteger> cnts =
new ConcurrentHashMap<>();

private void accumulate(String name) {
cnts.putIfAbsent(name, new AtomicInteger());
cnts.get(name).incrementAndGet();
}

对于 Java 7,没有 computeIfAbsent 方法,但实际上只是执行 putIfAbsent 后跟 get,所以效果相同通过调用这些方法来实现。不用担心 map 中已经存在该值;当且仅当映射没有该键的值时,才会添加一个新的零 AtomicInteger。即使另一个线程在我们之前进入并添加了一个零,两个线程都会看到并递增相同的 AtomicInteger 实例。

关于并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23497337/

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