Collections.synchronizedMap()
スレッド A によって読み取られ、更新される同期されたマップ (を介して) があります。スレッド B は、 Map.keySet()
(読み取り専用) を介してのみマップにアクセスします。
これを同期するにはどうすればよいですか?ドキュメントによると、keySet() (Collections.synchronizedMap の場合) は「同期ブロックにある必要はありません」。スレッド A の読み取り/書き込みアクセスを同期ブロック内に配置できますが、それは必要ですか?
Map.keySet を同期する必要がない場合 (上記のドキュメント リンクによると)、同期されたマップまたは同期されたブロックを使用することさえ奇妙に思えると思います...
更新: keySet の取得に同期は必要ありませんが、keySet の反復を同期する必要があることを見逃していました。それを調べることができずにkeySetを持っていることは特にエキサイティングではないので、最終結果=同期が必要です。代わりに ConcurrentHashMap を使用します。