CopyOnWriteArrayList
vs Array List in Java
CopyOnWriteArrayList is a concurrent Collection
class introduced in Java 5 Concurrency API along with its popular cousin ConcurrentHashMap
in Java. CopyOnWriteArrayList implements List interface
like ArrayList,
Vector
and LinkedList
but its a thread-safe collection and it achieves its thread-safety
in a slightly different way than Vector or other
thread-safe collection class. As name suggest CopyOnWriteArrayList creates
copy of underlying ArrayList with every
mutation operation e.g. add or set. Normally CopyOnWriteArrayList is very
expensive because it involves costly Array copy with every write
operation but its very efficient if you have a List
where Iteration outnumber mutation e.g. you mostly need to iterate
the ArrayList and don't modify it too often. Iterator of CopyOnWriteArrayList is fail-safe
and doesn't throw ConcurrentModificationException even if
underlying CopyOnWriteArrayList is modified once Iteration
begins because Iterator is operating on separate copy of ArrayList. Consequently all the updates made on CopyOnWriteArrayList is not available to Iterator. In this Java Collection tutorial we will see What is CopyOnWriteArrayList in Java, Difference between ArrayList and CopyOnWriteArrayList in Java and One simple Java program
example on How to use CopyOnWriteArrayList in Java.
Difference between CopyOnWriteArrayList and ArrayList in Java.
In last section we have seen What is CopyOnWriteArrayList in Java
and How it achieves thread-safety
by creating a separate copy
of List for each write operation. Now let's see Some difference between
ArrayList and CopyOnWriteArrayList in Java , which is another
implementation of List interface :
1) First and foremost difference between CopyOnWriteArrayList and
ArrayList in Java is that CopyOnWriteArrayList is a thread-safe
collection while ArrayList is not thread-safe and can not be used in
multi-threaded environment.
2) Second difference between ArrayList and CopyOnWriteArrayList is that Iterator
of ArrayList is fail-fast and throw ConcurrentModificationException once
detect any modification in List once iteration begins but Iterator of CopyOnWriteArrayList is
fail-safe and doesn't throw ConcurrentModificationException.
3) Third difference between CopyOnWriteArrayList vs
ArrayList is that Iterator
of former doesn't support remove operation while Iterator of later supports remove() operation.
CopyOnWriteArrayList Example in Java
Here is a complete code Example of CopyOnWriteArrayList which
demonstrate that Iterator
of CopyOnWriteArrayList doesn't support remove() operation.
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
/**
*
* Java program to demonstrate What is CopyOnWriteArrayList in Java,
import java.util.concurrent.CopyOnWriteArrayList;
/**
*
* Java program to demonstrate What is CopyOnWriteArrayList in Java,
* Iterator of CopyOnWriteArrayList
* doesn’t support add, remove or any modification operation.
*
* @author Java67
*/
public class CopyOnWriteArrayListExample{
public static void main(String args[]) {
CopyOnWriteArrayList<String> threadSafeList = new CopyOnWriteArrayList<String>();
threadSafeList.add("Java");
threadSafeList.add("J2EE");
threadSafeList.add("Collection");
//add, remove operator is not supported by CopyOnWriteArrayList iterator
Iterator<String> failSafeIterator = threadSafeList.iterator();
while(failSafeIterator.hasNext()){
System.out.printf("Read from CopyOnWriteArrayList : %s %n", failSafeIterator.next());
failSafeIterator.remove(); //not supported in CopyOnWriteArrayList in Java
}
}
}
Output:
Read from CopyOnWriteArrayList : Java
Read from CopyOnWriteArrayList : J2EE
Read from CopyOnWriteArrayList : Collection
* doesn’t support add, remove or any modification operation.
*
* @author Java67
*/
public class CopyOnWriteArrayListExample{
public static void main(String args[]) {
CopyOnWriteArrayList<String> threadSafeList = new CopyOnWriteArrayList<String>();
threadSafeList.add("Java");
threadSafeList.add("J2EE");
threadSafeList.add("Collection");
//add, remove operator is not supported by CopyOnWriteArrayList iterator
Iterator<String> failSafeIterator = threadSafeList.iterator();
while(failSafeIterator.hasNext()){
System.out.printf("Read from CopyOnWriteArrayList : %s %n", failSafeIterator.next());
failSafeIterator.remove(); //not supported in CopyOnWriteArrayList in Java
}
}
}
Output:
Read from CopyOnWriteArrayList : Java
Read from CopyOnWriteArrayList : J2EE
Read from CopyOnWriteArrayList : Collection
If we uncomment, commented code in this Java
program which modifies CopyOnWriteArrayList using
Iterator then we will get following Exception :
Read from CopyOnWriteArrayList
: Java
Exception in thread "main"
java.lang.UnsupportedOperationException
at
java.util.concurrent.CopyOnWriteArrayList$COWIterator.remove(CopyOnWriteArrayList.java:1004)
at
test.CollectionTest.main(CollectionTest.java:29)
Java Result: 1
That's all on What is CopyOnWriteArrayList, Difference
between CopyOnWriteArrayList and ArrayList in Java and an
Exmaple of CopyOnWriteArrayList. In Summary use CopyOnWriteArrayList if you
mostly require to Iterate over list without modifying it.
Related Java Collection Tutorial from Java67 Blog

I love CopyOnWriteArrayList because it doesn't throw any ConcurrentModificatoinException
ReplyDeleteGood Explanation! Easily understandable.helpful. thanks!
ReplyDeletesuperb,by using we can avoid ConcurrentModificationException,
ReplyDeleteWhen we remove object from array list