gpt4 book ai didi

java - 如何为许多写入者和许多读者(线程)添加和删除 HashMap?

转载 作者:行者123 更新时间:2023-12-02 08:57:08 27 4
gpt4 key购买 nike

没有关键字synchronized是否可以解决此代码?

我们可以使用ConcurrentHashMap或更好的带有synchronized关键字的HashMap(用于方法)吗?
或者更好的带有synchronized关键字(用于方法)的ConcurrentHashMap(用于迭代)?

这是关键部分代码,读取器线程获取统计信息并在值递减时(如果值为零,则删除统计信息,但并行写入器线程可能会增加值)。如何正确解决这个问题?

     Statistic statistic = data.get(id);
if (statistic != null) {
statistic.dec();

if (statistic.getValue() <= 0) {
data.remove(id);
}
public class Main {

private static final Map<Long, Statistic> data = new ConcurrentHashMap<>();

public static void main(String... args) throws IOException {
new Thread(() -> todoRunInWriterThread(1L)).start();
new Thread(() -> todoRunInReaderThread(1L)).start();

System.in.read();
}

//Many writers write some statistics
private static void todoRunInWriterThread(long id) {
Statistic statistic = data.get(id);
if (statistic == null) {
statistic = new Statistic();
data.put(id, statistic);
}

statistic.inc();
}

//Many readers read statistic and decrement value,
//if statistic value is zero (remove statistic)
private static void todoRunInReaderThread(long id) {
Statistic statistic = data.get(id);
if (statistic != null) {
statistic.dec();

if (statistic.getValue() <= 0) {
data.remove(id);
}
}
}

public static class Statistic {
private AtomicLong value = new AtomicLong(0);

public long getValue() {
return value.longValue();
}

public void inc() {
value.incrementAndGet();
}

public void dec() {
value.decrementAndGet();
}
}
}

最佳答案

我相信你应该使用ConcurrentHashMap。它在大多数情况下具有良好的性能,并且您的写入线程情况(获取...检查是否为空...放置)可以使用 ConcurrentHashMap#computeIfAbsent 解决 -> 它将在内部处理所有锁定。

另外请研究一下 ConcurrentHashMap 的工作原理。它不是简单地为每个方法使用同步关键字。涉及到一些 strip 锁定,这对性能确实有好处

关于java - 如何为许多写入者和许多读者(线程)添加和删除 HashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60428409/

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