2012-04-19 5 views
-1

このコードブロックに対してConcurrentModificationExceptionを取得する方法はありますか?ConcurrentModificationExceptionは、リストを介して反復処理され、イテレータを使用して同期化されます。

synchronized (list) { 
     for (Iterator<?> it = list.iterator(); it.hasNext();) { 
      Object object = it.next(); 
      // do something to object without touching list 
     } 
} 

編集:申し訳ありませんが、それが十分特異的ではなかった://直接的または間接的に「何かをする」はlistから何かを追加または削除する場合は、オブジェクトに何かをする以外に(リストに

+3

リストは実際のリストまたはラッパーですか?それがラッパーである場合、ロックはバッキングリストそのものにはありません。 – Thomas

+0

+1良いポイントですが、それは実際のリストです。ラッパーはありません。 –

+0

for-eachループはより簡単になります。 –

答えて

7

たとえば、リストを変更する別のスレッドがあるとします。

このコードブロックを同期させても、リストへのアクセスがすべてブロックされているわけではありません。リスト上で同期された他のすべてのブロックが並行して実行できないようにします。

リストが複数のスレッドで共有されている場合は、すべてそのモニターは同じモニターで同期する必要があります。

2

に触れないでくださいit.remove()などを使用して)、この例外が発生します。この場合、同期によって同期が停止することはありません。

+1

「it.remove()などを使用する以外は」を追加する必要があります。 – Thomas

+0

実際、完了しました。ありがとう。 –

関連する問題