Friday, September 7, 2012

What is CopyOnWriteArrayList in Java - Example Tutorial

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

CopyOnWriteArrayList Example in Java - Difference with ArrayList 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,
 * 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



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

4 comments:

  1. I love CopyOnWriteArrayList because it doesn't throw any ConcurrentModificatoinException

    ReplyDelete
  2. Good Explanation! Easily understandable.helpful. thanks!

    ReplyDelete
  3. superb,by using we can avoid ConcurrentModificationException,
    When we remove object from array list

    ReplyDelete
  4. ArrayList arrayList = new ArrayList();
    arrayList.add("1");
    arrayList.add("2");
    arrayList.add("3");

    Iterator iterator = arrayList.iterator();
    while(iterator.hasNext()) {
    String value = iterator.next();
    if(value.equals("2")) {
    System.out.println(arrayList.remove(1));
    }
    }

    Why it is not giving Concurrent Exception?

    ReplyDelete

Java67 Headline Animator