のドキュメントを読んでいるjava.util.HashMap
と、次のように書かれています。
複数のスレッドがこのマップに同時にアクセスし、少なくとも 1 つのスレッドがマップを構造的に変更する場合は、外部で同期する必要があります。
どういう意味ですか?「それ」は、マップを変更するスレッドを意味すると解釈することも、マップ自体を意味することもできます。
「複数のスレッドの読み取りに対して安全」と「ライターがある場合は単一のスレッドでのみ安全」のケースはどちらも(少なくとも私にとっては)簡単なことではありません。ドキュメントは、ステートメントが「ライターがある場合はすべてをロックする」という簡単なことではなく、「複数のスレッドが読み取り、単一のスレッドが書き込みを行っても安全」と解釈する必要があることを意味します。
さらに、.Net でのハッシュテーブルの実装は (明確に) 次のように文書化されています。
Hashtable は、複数のリーダー スレッドと 1 つの書き込みスレッドで使用できるスレッド セーフです。
(.Net クラスはデフォルトではスレッド セーフではありません)、したがって、「複数のリーダー スレッドと 1 つのライター スレッド」の場合には何かが必要です。