これは私がマップを持っており、安全にスレッドのキーセット公開したいかなり一般的な発生でなければなりません:今すぐスレッド・セーフな方法は、()
public MyClass {
Map<String,String> map = // ...
public final Set<String> keys() {
// returns key set
}
}
を、私の「マップ」場合は、スレッドではありません
public final Set<String> keys() {
return map.keySet();
}
ともされていない:-safe、これは安全ではないん
public final Set<String> keys() {
return Collections.unmodifiableSet(map.keySet());
}
だから私のような、コピーを作成する必要があります。
public final Set<String> keys() {
return new HashSet(map.keySet());
}
しかし、これは、そのコンストラクタがパラメータの要素を横断してadd()するため、安全ではないようです。したがって、このコピーが実行されている間に、ConcurrentModificationExceptionが発生することがあります。それでは
:
public final Set<String> keys() {
synchronized(map) {
return new HashSet(map.keySet());
}
}
は、ソリューションのように思えます。これは正しいか?
マップ自体は公開されておらず、そのキーセットのみが公開されています。そしてその鍵のコピーがそれにセットされます。 – Jake
はい、私はそれが何か変わるとは思わない?そのブロックを同期させても、修正しようとしていたハザードは修正されません。 – Affe
あなたが 'ConcurrentModificationException'を心配している場合は、マップが非スレッドセーフな方法で公開されていることを意味します。 –