0

Collectionシングルスレッド環境でのみ使用したかったのHashMapですが、同期されているを使用しています。

ただし、同期することがスレッドセーフかどうかはまだ疑問です。

4

5 に答える 5

4

単一のスレッドのみを使用している場合は、スレッドセーフなコレクションは必要ありHashMapません。問題ないはずです。

要件を理解するために非常に注意する必要があります。

  • 本当に単一のスレッドを使用している場合は、固執するHashMap(または検討するLinkedHashMap
  • マップを共有している場合は、どのような安全性が必要かを判断する必要があります。
    • 読み取ったばかりの複数のスレッドで使用される前にマップが完全に入力されている場合 HashMapでも、問題はありません。
    • Collections.synchronizedMap個々の操作のみを同期します。あるスレッドで反復し、同期せずに別のスレッドでマップを変更することは、依然として安全ではありません。
    • ConcurrentHashMapこれは、より「完全に」スレッドセーフなアプローチであり、私が一般的に好むアプローチsynchronizedMapです。反復中の変更は可能ですが、反復中にそのような変更がどこで見られるかを保証するものではありません。HashMapまた、nullキーと値を許可しますが、許可ConcurrentHashMapしないことにも注意してください。
于 2013-03-01T06:46:15.717 に答える
3
  1. 標準のJavaHashMapは同期されていません。
  2. シングルスレッド環境にいる場合は、同期について心配する必要はありません。
于 2013-03-01T06:45:13.363 に答える
3

必要に応じて、 を使用しますConcurrentHashMap。複数のスレッドをブロックすることなく、複数のスレッドから Map を同時に変更できます。Collections.synchronizedMap(map)一貫性は確保されますが、パフォーマンスを低下させるブロッキング マップを作成します。

于 2013-03-01T06:43:24.677 に答える
0

などの一般的に使用されるCollectionクラスjava.util.ArrayListは同期されません。ただし、2つのスレッドがコレクションを同時に変更する可能性がある場合は、synchronizedCollection()メソッドを使用してコレクションから同期コレクションを生成できます。読み取り専用メソッドと同様に、スレッドセーフAPIを使用すると、同期されたコレクション、リスト、セット、またはマップを生成できます。たとえば、これは、HashMap:から同期マップを生成する方法です。

  Map map = Collections.synchronizedMap(new HashMap());
  map.put(...
于 2013-03-01T06:44:44.547 に答える
0

シングルスレッド環境として、HashMapを安全に使用できます。

于 2013-03-01T06:44:55.277 に答える