Collection
シングルスレッド環境でのみ使用したかったのHashMap
ですが、同期されているを使用しています。
ただし、同期することがスレッドセーフかどうかはまだ疑問です。
Collection
シングルスレッド環境でのみ使用したかったのHashMap
ですが、同期されているを使用しています。
ただし、同期することがスレッドセーフかどうかはまだ疑問です。
単一のスレッドのみを使用している場合は、スレッドセーフなコレクションは必要ありHashMap
ません。問題ないはずです。
要件を理解するために非常に注意する必要があります。
HashMap
(または検討するLinkedHashMap
)HashMap
でも、問題はありません。Collections.synchronizedMap
個々の操作のみを同期します。あるスレッドで反復し、同期せずに別のスレッドでマップを変更することは、依然として安全ではありません。ConcurrentHashMap
これは、より「完全に」スレッドセーフなアプローチであり、私が一般的に好むアプローチsynchronizedMap
です。反復中の変更は可能ですが、反復中にそのような変更がどこで見られるかを保証するものではありません。HashMap
また、nullキーと値を許可しますが、許可ConcurrentHashMap
しないことにも注意してください。必要に応じて、 を使用しますConcurrentHashMap
。複数のスレッドをブロックすることなく、複数のスレッドから Map を同時に変更できます。Collections.synchronizedMap(map)
一貫性は確保されますが、パフォーマンスを低下させるブロッキング マップを作成します。
などの一般的に使用されるCollection
クラスjava.util.ArrayList
は同期されません。ただし、2つのスレッドがコレクションを同時に変更する可能性がある場合は、synchronizedCollection()
メソッドを使用してコレクションから同期コレクションを生成できます。読み取り専用メソッドと同様に、スレッドセーフAPIを使用すると、同期されたコレクション、リスト、セット、またはマップを生成できます。たとえば、これは、HashMap
:から同期マップを生成する方法です。
Map map = Collections.synchronizedMap(new HashMap());
map.put(...
シングルスレッド環境として、HashMapを安全に使用できます。