
java.util.List is an ordered collection also known as a sequence. ArrayList is a very basic implementation of List. There are number of articles I’ve posted on Crunchify before on ArrayList list convert HashMap to ArrayList, Find unique values from ArrayList, etc.
In this tutorial we will go over why we could use CopyOnWriteArrayList to avoid java.util.ConcurrentModificationException.
Let’s get started:
- Create class CrunchifyCopyOnWriteArrayList.java
- Create a List
companies - Add 5 values to
companiesand iterate through List - While iterating modify (add/remove) elements from List
- You will see ConcurrentModificationException because its internal
modCountwas what tipped off the iterator - Now Just comment
line 18and uncommentline 21and re-run program.
package crunchify.com.tutorials;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* @author Crunchify.com
*
*/
public class CrunchifyCopyOnWriteArrayList {
public static void main(String[] args) {
// Disable this to avoid ConcurrentModificationException
List<String> companies = new ArrayList<>();
// Enable this to avoid ConcurrentModificationException
// List<String> companies = new CopyOnWriteArrayList<>();
companies.add("Google");
companies.add("Yahoo");
companies.add("Facebook");
companies.add("eBay");
companies.add("Microsoft");
// Get an iterator over a collection. Iterator takes the place of
// Enumeration in the Java Collections Framework.
Iterator<String> crunchifyIterator = companies.iterator();
// Make changes to companies List while performing hasNext()
while (crunchifyIterator.hasNext()) {
System.out.println("companies list: " + companies);
String crunchifyString = crunchifyIterator.next();
// Test1: Below statement causes ConcurrentModificationException
System.out.println(crunchifyString);
if (crunchifyString.equals("Yahoo"))
// modCount = 6
companies.remove("Microsoft");
if (crunchifyString.equals("eBay"))
companies.add("My Message Goes here... eBay present");
// Test2: Below change wont throw ConcurrentModificationException
// Reason: It doesn't change modCount variable of "companies"
if (crunchifyString.equals("Google"))
companies.set(2, "Google");
}
}
}
Why java.util.ConcurrentModificationException:
Point-1)
After adding all 5 companies to list you will see modCount = 5, size = 5

Point-2)
After removing element Microsoft you will see modCount = 6, size = 4 which causes an exception.

How to solve java.util.ConcurrentModificationException
Just use CopyOnWriteArrayList instead of ArrayList in above program. During debug you will see it will add ReentrantLock on object.

Let me know if you face any issue running this program.
