現在Java Goldの問題を解いています。
その中で並列コレクションの問題を解いているのですが、理解できない箇所があるためアドバイス頂けたらと思い質問しました。
問題は以下で、実行結果は「実行時エラー(java.util.ConcurrentModificationException)が発生する」というものです。
Java
1import java.util.*; 2 3class Test { 4 public static void main(String[] args) { 5 Set<String> set = new TreeSet<String>(); 6 set.add("A"); set.add("B"); 7 Iterator<String> ite = set.iterator(); 8 set.add("C"); set.add("D"); 9 while(ite.hasNext()){ 10 System.out.print(ite.next() + " "); 11 } 12 } 13} 14
しっくりこないところは
結論から言うと、
なぜ直接イテレータオブジェクトに詰めている訳ではないのに、
ite.next()
の部分で実行時エラーが発生してしまうのかということです。
イテレータオブジェクト生成後、TreeSetオブジェクトに要素を追加し、要素の取り出しを行っているためエラーが発生する。ということはわかりました。
しかし、文字列C,Dは直接イテレータオブジェクトに詰め込んでいないし、
要素を取り出そうとしているのはsetとかでなく、イテレータオブジェクトに対してなのでなぜ影響が出るのかわかりません。そこがしっくりきていない箇所です。
ConcurrentModificationException例外は「あるスレッドがコレクションで繰り返し処理を行っている間に、別のスレッドがそのコレクションを変更する」といったときに起こるという認識ですが、
スレッドもコードに特に記述がないので、なぜ起きているのかわかっていません。
Set<String> set = new TreeSet<String>(); を
CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet<String>(); に変えるとスレッドセーフとなるため例外が発生しないことも知っています。C,D追加の変更は反映されませんが。
言葉ではわかっているけどロジック的に理解できていないような感じです。
アドバイスいただけると幸いです。よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/03 02:31
2017/05/03 02:34
2017/05/03 02:40
2017/05/03 02:43
2017/05/03 03:18
2017/05/03 03:20
2017/05/03 03:28
2017/05/03 03:47
2017/05/03 06:30
2017/05/03 13:46