15

マルチスレッド環境でリストを安全にするVector代わりに使用しています。ArrayListしかし、反復中ConcurrentModificationExceptionにアイテムを追加しようとすると、取得し続けます。Vectorそれはなぜですか、どうすれば防ぐことができますか?

4

3 に答える 3

9

反復処理中にベクターを変更することはできません。追加するアイテムを別のベクターに保存し、ループが終了したときにベクターに移動するか、元のベクターのコピーをループします。

追加: Java で Vector のミューテックスを取得するには、両方の関数でこれを行います。

synchronized (list) {
  // modifying list
}

と:

synchronized (list) {
  // iterating over list
}

もちろん、リストには名前が付けられていると想定しましたlist

于 2013-03-15T16:46:03.953 に答える
2

繰り返しながらアイテムを追加したい場合は、ListIterator. を使用するVectorことで、このルールをバイパスしていない (明らかに) ため、代わりに を使用することをお勧めしArrayListます。

于 2013-03-15T16:47:10.040 に答える
2

反復してリストに同時に追加する必要がある場合は、 などの同時実行リストを使用する必要がありますCopyOnWriteArrayList。リストにたくさん書くとあまり効率的ではないことに注意してください。

それ以外の場合、Vector または synchronizedList を使用する場合は、反復中にリストのロックを保持する必要があります。それは例外を防ぎますが、並行性も防ぎます...

于 2013-03-15T16:56:53.143 に答える