List<Integer> contacts = new Vector<Integer>();
Collections.sort(contacts);
ベクトルがスレッドセーフであることはわかっていますが、上記を実行すると何か問題がありますか?
List<Integer> contacts = new Vector<Integer>();
Collections.sort(contacts);
ベクトルがスレッドセーフであることはわかっていますが、上記を実行すると何か問題がありますか?
ベクトルはスレッドセーフです
その各メソッドはスレッドセーフです。ただしCollections.sort
、アトミック操作ではないベクトルを反復処理します。特に、Vector の javadocには次のように記載されています。
反復子が作成された後、反復子自体の remove または add メソッド以外の方法でベクトルが構造的に変更された場合、反復子は ConcurrentModificationException をスローします。
そのため、ベクターを並べ替えているときに別のスレッドによってベクターが変更されると、例外が発生します。
複数のスレッドが構造体にアクセスできる場合の代替手段には、防御的なコピーを作成するか、CopyOnWriteArrayList などの同時構造体を使用することが含まれます。
これを使用して、このコードをスレッドセーフにすることができます。
List<Integer> contacts = new Vector<Integer>();
synchronized(contacts) {
Collections.sort(contacts);
}