2016-07-25 3 views
0

以下のスニペットコードがあります。私は2つのスレッドAとBが同時に動作している。 forループのこのフォームでループ内にConcurrentModificationExceptionがあるかどうか

List<String> listPeople = new ArrayList<>(); 
// Add more item 
..... 

Thread A 
for (String item : listPeople) { 
    System.out.println("Name is: " + item.name); 
} 

Thread B 
- add/remove item to list people 

、それはリストのiteratorを経由してループします。だからConcurrentModificationExceptionでクラッシュするのですか? ConcurrentModificationException Javadocから

+0

@Daniel Prydenは彼の答えで説明したように、あなたはそれを信じることができません。時には、ConcurrentModificationExceptionがスローされ、そうでない場合もあります。 –

+0

yrの回答ありがとうございます。安全のために、私はfor(;;)ステートメントを使うべきでしょうか? –

答えて

4

メモこの例外は常にオブジェクトが同時に異なるスレッドによって変更されたことを示していないこと。 [...]

一般に、同期化されていない同時変更がある場合には、ハード保証ができないため、フェイル・ファーストの動作は保証されません。フェイル・ファスト・オペレーションは、ベスト・エフォート・ベースでConcurrentModificationExceptionをスローします。したがって、この例外に依存するプログラムを記述するのは間違いです。ConcurrentModificationExceptionは、バグを検出するためにのみ使用してください。

+0

yrの回答ありがとうございます。安全のために、私はfor(;;)ステートメントを使うべきでしょうか? –

+0

@HuyDuongTu:いいえ、安全のためには、スレッド間でコレクションを共有しないようにするか、スレッドセーフな実装を使用するようにしてください。たとえば、同じモニタロックを使用して、 'ArrayList'変数のすべてのアクセスを同期させることができます。 –

関連する問題