我已經看到了這本書的Java 7次的配方更新,並同時遍歷一個地圖驗證碼:更新(和遍歷)在Java中
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個線程是否合理?
你是什麼意思「用Java VisualVM監控」? –
當你插入隨機的東西,我不明白你如何得出結論是相同的? – fvu
那你有什麼問題?如果結果相同,會出現什麼問題?那麼你的期望是什麼? –