ConcurrentModificationException is thrown by a method when it detected a concurrent modification of an object when such modification is not permissible.
Let’s see it with an example.
for(Integer i : list) {
System.out.println(i);
list.remove(i);
}
In the above example, we are trying to remove the element while iterating. This is not permissible, if you want to remove the element while iterating, you can use iterator remove method.
ConcurrentModificationDemo1.java
package com.sample.app;
import java.util.ArrayList;
import java.util.List;
public class ConcurrentModificationDemo1 {
public static void main(String args[]) {
List<Integer> list = new ArrayList<> ();
list.add(10);
list.add(11);
list.add(12);
list.add(13);
list.add(14);
for(Integer i : list) {
System.out.println(i);
list.remove(i);
}
}
}
Output
10
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at com.sample.app.ConcurrentModificationDemo1.main(ConcurrentModificationDemo1.java:16)
You will get ConcurrentModificationException, by adding new elements to the list while iterating.
ConcurrentModificationDemo2.java
package com.sample.app;
import java.util.ArrayList;
import java.util.List;
public class ConcurrentModificationDemo2 {
public static void main(String args[]) {
List<Integer> list = new ArrayList<> ();
list.add(10);
list.add(11);
list.add(12);
list.add(13);
list.add(14);
for(Integer i : list) {
System.out.println(i);
list.add(100);
}
}
}
Output
10
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at com.sample.app.ConcurrentModificationDemo2.main(ConcurrentModificationDemo2.java:15)
How to avoid this problems?
a. Do not update the state of the collection while iterating.
b. If you want to remove the collection elements while iterating, use iterator remove method.
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
iter.remove();
}
ConcurrentModificationDemo3.java
package com.sample.app;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ConcurrentModificationDemo3 {
public static void main(String args[]) {
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(11);
list.add(12);
list.add(13);
list.add(14);
System.out.println("List size : " + list.size());
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
iter.remove();
}
System.out.println("List size : " + list.size());
}
}
Output
List size : 5 10 11 12 13 14 List size : 0
What is fail-fast iterator?
Iterators that fail by throwing ‘ConcurrentModificationException’ whenever they find a state change in the underlying collection are called fail-fast iterators.
Reference
You may like
NumberFormatException Explained
Initial heap size set to a larger value than the maximum heap size
No comments:
Post a Comment