0
List<Integer> contacts = new Vector<Integer>();

Collections.sort(contacts);

ベクトルがスレッドセーフであることはわかっていますが、上記を実行すると何か問題がありますか?

4

3 に答える 3

2

ベクトルはスレッドセーフです

その各メソッドはスレッドセーフです。ただしCollections.sort、アトミック操作ではないベクトルを反復処理します。特に、Vector の javadocには次のように記載されています。

反復子が作成された後、反復子自体の remove または add メソッド以外の方法でベクトルが構造的に変更された場合、反復子は ConcurrentModificationException をスローします。

そのため、ベクターを並べ替えているときに別のスレッドによってベクターが変更されると、例外が発生します。

複数のスレッドが構造体にアクセスできる場合の代替手段には、防御的なコピーを作成するか、CopyOnWriteArrayList などの同時構造体を使用することが含まれます。

于 2012-11-15T18:57:20.760 に答える
2

これを使用して、このコードをスレッドセーフにすることができます。

List<Integer> contacts = new Vector<Integer>();

synchronized(contacts) {
  Collections.sort(contacts);
}
于 2012-11-15T19:48:35.150 に答える