0

私は本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 で監視)。誰かが理由を知っていますか?

ありがとう、アグスティン

更新: いくつかの興味深い質問:

  1. HashMap の容量が一定の場合、安全に実行できる操作は次のうちどれですか?
    • HashMap の値を更新する 2 つのスレッド。
    • 2 つのスレッドが HashMap の値を更新している間に、3 つ目のスレッドが HashMap を読み取っています。
  2. Map の更新速度が必要な場合、プロセッサが 4 つしかないコンピューターに 4 つ以上のスレッドを使用することは理にかなっていますか?
4

2 に答える 2

2

ConcurrentHashMapマルチスレッドアクセスが可能ですが、HashMapそうでないものとは対照的です。

HashMap#put同時に複数のスレッドから呼び出すと、マップが壊れる可能性があります。ConcurrentHashMapこれらのシナリオを処理し、競合状態を軽減します。

特にテストに関しては、マップには 20 個のキーしかないため、比較的すぐにいっぱいになります。ハッシュマップの弱点は、バケット スペースを拡張すると同時に別のエントリを配置する必要がある場合です。キーの数を増やしてみるInteger.MAX_VALUEと、破損する可能性がはるかに高くなります。

于 2013-10-27T10:15:00.590 に答える