次のコードブロックは、複数のスレッドがイテレータを使用してリストを変更しているので、プログラムをフェイル・ファスト・イベントにしてスローしますそれはOKを実行する、何が間違っている?なぜFailfastイベントとConcurrentModificationExceptionを得ることができないのですか?
import java.util.*;
import java.util.concurrent.*;
public class FastFailTest {
private static List<String> list = new ArrayList<String>();
public static void main(String[] args) {
new ThreadOne().start();
new ThreadTwo().start();
}
private static void printAll() {
System.out.println("");
String value = null;
Iterator iter = list.iterator();
while(iter.hasNext()) {
value = (String)iter.next();
System.out.print(value+", ");
}
}
private static class ThreadOne extends Thread {
public void run() {
int i = 0;
while (i<6) {
list.add(String.valueOf(i));
printAll();
i++;
}
}
}
private static class ThreadTwo extends Thread {
public void run() {
int i = 10;
while (i<16) {
list.add(String.valueOf(i));
printAll();
i++;
}
}
}
}
スレッドは、OSがその実行中のスケジュールやライフサイクルを管理しているので、プログラマが自分の実行順序に依存することができますいくつかのルーチンではありません。あなたの 'ThreadOne'のライフサイクルが短くて、' ThreadTwo'がOSによって実行される前に完全に実行されている可能性があります。したがって、同時実行は発生せず、例外もスローされません。共有リソースの同時実行と変更の可能性をいくらか増加させるために、スレッドで時間のかかるジョブを管理したい場合があります。 – STaefi
これを取得する簡単な方法は 'for(String s:list)list.remove(s);'です。人々は(名前のために)スレッドと 'ConcurrentModificationException'を関連づけますが、ほとんどの場合、それは並行プログラミングによるものではありません。 – Kayaman
例外は私に起こります。ここでの教訓は、マルチスレッドエラーは、実験/テストによって実際には見つけるのが難しいことです。正しいマルチスレッドコードを書くための最良の方法は、本当に注意深く、論理を通して考えることです。コードが壊れているとの前提から始めて、コードが壊れていないことを自分自身に証明してください。 – yshavit