私は本Java 7レシピでこのコードを見て、マップを同時に更新および反復します。
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();
}
ConcurrentHasMap の代わりに HashMap だけを試してみましたが、結果は同じです (Java VisualVM で監視)。誰かが理由を知っていますか?
ありがとう、アグスティン
更新: いくつかの興味深い質問:
- HashMap の容量が一定の場合、安全に実行できる操作は次のうちどれですか?
- HashMap の値を更新する 2 つのスレッド。
- 2 つのスレッドが HashMap の値を更新している間に、3 つ目のスレッドが HashMap を読み取っています。
- Map の更新速度が必要な場合、プロセッサが 4 つしかないコンピューターに 4 つ以上のスレッドを使用することは理にかなっていますか?