gpt4 book ai didi

java - 在 Java 中更新(和迭代) map

转载 作者:行者123 更新时间:2023-12-01 23:28:59 24 4
gpt4 key购买 nike

我在Java 7 Recipes to update and iterate a Map一书中看到了这段代码:

ConcurrentMap<Integer,String> concurrentMap = new ConcurrentHashMap<Integer, String>();
for (int i =0;i < 1000;i++) {
startUpdateThread(i, concurrentMap);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (Map.Entry<Integer, String> entry : concurrentMap.entrySet()) {
System.out.println("Key :"+entry.getKey()+" Value:"+entry.getValue());
}

更新 map 的方法如下:

private void startUpdateThread(int i, final ConcurrentMap<Integer, String> concurrentMap) {
Thread thread = new Thread(new Runnable() {
public void run() {
while (!Thread.interrupted()) {
int randomInt = random.nextInt(20);
concurrentMap.put(randomInt, UUID.randomUUID().toString());
}
} });
thread.setName("Update Thread "+i);
updateThreads.add(thread);
thread.start();
}

我尝试仅使用 HashMap 而不是 ConcurrentHasMap,结果是相同的(使用 Java VisualVM 进行监控)。有谁知道为什么?

谢谢,奥古斯丁

更新:一些有趣的问题:

  1. 如果HashMap的容量恒定,下面哪些操作可以安全地执行?
    • 两个线程更新 HashMap 中的值。
    • 两个线程更新 HashMap 中的值,而第三个线程正在读取 HashMap。
  2. 如果我想要加快更新 map 的速度,那么在只有 4 个处理器的计算机中拥有 4 个以上的线程是否有意义?

最佳答案

ConcurrentHashMap 允许多线程访问,而 HashMap 则不允许。

同时从多个线程调用 HashMap#put 可能会破坏您的映射。 ConcurrentHashMap 处理这些场景并缓解竞争条件。

特别是对于您的测试,您的 map 只有 20 个键,这意味着它会相对较快地填满。 hashmap 的弱点是当你需要扩展桶空间并同时放置另一个条目时。尝试将键的数量增加到 Integer.MAX_VALUE,您将有更高的机会看到它损坏。

关于java - 在 Java 中更新(和迭代) map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19616858/

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