2
List<Ball> myObjs = myThreads[threadIndex].getMyObjList();
int initialSize = Collections.synchronizedList(myObjs).size();

ConcurrentModificationException をスローします。これを同期(myObjs)ブロックに入れてみましたが、うまくいきませんでした。解決策は何ですか?私がこのリストを使用する他の場所では、それは同期(ブロック)にあります。

PS このエラーは最終的に BrokenBarrierException を生成します。(はい、同期にサイクリック バリアを使用しています)

編集: スタック トレースは次のとおりです。

Exception in thread "Thread-3" java.util.ConcurrentModificationException
at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1091)
at java.util.ArrayList$SubList.size(ArrayList.java:921)
at java.util.Collections$SynchronizedCollection.size(Collections.java:1573)
at Part2.Animation.processCollisions(MyClass.java:133) // This is the call to size()

編集:ループは次のようになります

for (int threadIndex=0; threadIndex < numThreads; threadIndex++) {
  List<Ball> myObjs = myThreads[threadIndex].getMyObjList();
  int initialSize = Collections.synchronizedList(myObjs).size();
}

また、numThreads に関係なく、threadIndex=1 の場合に例外が発生します。

4

3 に答える 3

4

一部のクラスのソースコードを見ると、呼び出しによってががスローされるList可能性があることがわかりません。スタックトレースを見せていただければ助かります。size()ConcurrentModificationException


しかし、その間、あなたは何をするかについて根本的な誤解を持っているようにCollections.synchronizedList見えます。同じラッパーインスタンスでの操作が同期されることを保証するリストラッパーを作成して返します。

とにかく、スレッドが基になるリストに対して非同期操作を実行するのを防ぐことはできません。つまり、ラップしたばかりのリストオブジェクトです。スレッドに基になるリストへの参照がある場合、ラッパーを経由せずにスレッドに直接アクセスできます。また、同じ基になるリストに対して異なるラッパーを使用して操作を同期することもできません。したがってCollections.synchronizedList、同じリストで2回呼び出すと、互いに同期しない2つの異なるラッパーが作成されます。

したがって、実際にCollections.synchronizedList(myObjs).size()は、意味のある同期はまったく実行されません。他のスレッドは作成された同期リストラッパーを取得できないため、他のスレッドはラッパーを介してこのラッパーと同期できません。

于 2012-07-23T03:34:33.943 に答える
2

が原因でsubList()、同期とは関係ありません。

myObjsは subList() の結果であり、実際には myObjs は元の List のビューです。元のリストが変更された場合、が呼び出されたConcurrentModificationExceptionときに発生します。subList.size()ビューは元のリストと一貫している必要があります。

代わりに、次のようなサブリストを取得できます。

List mySubList = new ArrayList(originalList.subList(a, b));
于 2012-07-25T05:09:07.927 に答える
0

CopyOnWriteArrayList2 つ以上のスレッドを含むリストを変更する場合は、 を使用する必要があります。

「この配列は反復子の有効期間中に変更されることはないため、干渉は不可能であり、反復子は ConcurrentModificationException をスローしないことが保証されています。」

于 2012-07-23T03:26:51.630 に答える