我在 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());
}
以及更新地图的方法如下:
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 监控)。有谁知道为什么?
谢谢,奥古斯丁
更新:几个有趣的问题:
- 如果 HashMap 的容量是恒定的,那么以下哪些操作可以安全地执行?
- 两个线程更新 HashMap 中的值。
- 两个线程更新 HashMap 中的值,而第三个线程正在读取 HashMap。
- 如果我想加快更新地图的速度,那么在只有 4 个处理器的计算机中拥有超过 4 个线程是否有意义?