現在Java Silverの勉強をしています。
そこでConcurrentModificationExceptionの問題がありました。
ConcurrentModificationExceptionは、ArrayListなどの非同期クラスのインスタンスが、別スレッドから変更されるとスローされるというのは知っているのですが、
ではなぜ次のような2パターンでは例外がスローされるのとされないので分かれるのでしょうか?
つまり、
下記のコードの前者ではConcurrentModificationExceptionが発生しないのに、
後者では発生するのはなぜでしょうか?
Java
1public class Main { 2 public static void main(String[] args) { 3 ArrayList<String>list=new ArrayList<String>(); 4 list.add("A"); 5 list.add("B"); 6 list.add("C"); 7 for (String str : list) { 8 if ("B".equals(str)) { 9 list.remove(str); 10 } 11 } 12 } 13}
Java
1public class Main { 2 public static void main(String[] args) { 3 ArrayList<String>list=new ArrayList<String>(); 4 list.add("A"); 5 list.add("B"); 6 list.add("C"); 7 for (String str : list) { 8 if ("C".equals(str)) { 9 list.remove(str); 10 } 11 } 12 } 13}
もちろん変更点はif文の条件が「B」と「C」とで変わっている点だとわかっているのですが、
それだとなぜ前者と後者で例外がスローされないのとされるので変わるかわかりません。
removeメソッドで要素を削除した場合、要素が繰り上がるのも知っています。
そもそもどこがどうマルチスレッドなのかがわかっていません。
言葉では「要素を取り出している処理」と「要素を削除している処理」の2つが並列処理なのかなとは思っているのですが、
コード上の動きや仕組みとしていまいちピンときていません。
いろいろと具体的に挙げてしまいましたが、
まずはなぜこの両者で例外が発生しないのとするので分かれるのか理解したいと思います。
もしわかる方がいればお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/28 05:24