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を安全に使用できます。