2

このコードを別のスレッド (UI スレッドではない) で実行しています。

strains = new ArrayList<Strain>();
for (Breeder b : breeders) {
   for (Strain s : b.getStrains()) {
        strains.add(s);
    }
}

ConcurrentModificationException が発生することがあります。反復しているコレクションにオブジェクトを追加または削除できないことはわかっていますが、このスニペットでは、ひずみを反復していません。どこが間違っていますか?ありがとう

4

1 に答える 1

1

アクセスを同期します。この種のは現在のオブジェクトをフリーズするbreederため、他のスレッドで変更されることはありません。これを行おうとするメソッドはブロックされます。ブロックとは、他のスレッドのブロックが処理されるまで、(System.sleep(x)のように)待機することを意味しsynchronized

synchronized(breeders) {
    for (Breeder b : breeders) {
       for (Strain s : b.getStrains()) {
            strains.add(s);
        }
    }
}

synchronized他のスレッドのへのアクセスも忘れないでくださいbreeders

于 2013-03-10T16:04:58.803 に答える