In this article, we will discuss CopyOnWriteArraySet class – the implementation class for Set interface in detail
This is the thread-safe version of Set and it’s internally implemented using CopyOnWriteArrayList, where modify operation is performed on a separate cloned copy and finally JVM merges both original/cloned copies
As it is internally implemented using COWAL, therefore all properties of COWAL are applicable to COWAS also except COWAS doesn’t allow duplicate objects
- COWAL –> CopyOnWriteArrayList
- COWAS –> CopyOnWriteArraySet
CopyOnWriteArraySet:
- CopyOnWriteArraySet is implementation class of Set interface (i.e.; CopyOnWriteArraySet implements Set)
- Internally COWAS is implemented using COWAL
- So for every modify/update operation, a new separate cloned copy is created and modification is performed on cloned copy; while other threads can iterate over original copy
- After modification/updation, JVM takes care of merging both copies (i.e.; original and cloned copy) –> so that we get latest copy with all updation/modification
- Since, every time a new separate cloned copy is created for updation/modification. Therefore, it is suited for multi-threaded environment where there are more read/get operation and comparatively less update/modify operation
- While one thread iterating over original copy, other threads can modify with separate cloned copy and compiler won’t throw any ConcurrentModificationException; which isn’t case with other Set implemented classes like HashSet/TreeSet
- It never throws ConcurrentModificationException while 2 or more threads operating simultaneously i.e.; it is fail-safe iterator
- But, there are certain limitation too with CopyOnWriteArraySet which isn’t case with Set implemented classes like HashSet or TreeSet like while iterating COWAS, remove operation isn’t possible and compiler throws UnsupportedOperationException
- Other than above discussed points, all other properties of COWAL are applicable for COWAS too i.e.;
- Insertion-order is maintained, as it is internally implemented by COWAL
- Duplicate objects are NOT allowed (this is one of the major difference between COWAL & COWAS)
- Null insertion is possible
- This is introduced in Java 1.5 version
- Present in java.util.concurrent package and implements java.util.Set
- Also, implements java.io.Serializable marker interfaces which provides special ability to CopyOnWriteArraySet (provided by JVM at run time) like,
java.io.Serializable: to transfer objects across network
Source: Team BenchResources.Net
CopyOnWriteArraySet constructors:
CopyOnWriteArraySet cowas = new CopyOnWriteArraySet();
- creates an empty CopyOnWriteArraySet object
CopyOnWriteArraySet cowas = new CopyOnWriteArraySet(Collection c);
- creates an equivalent CopyOnWriteArraySet object for the specified collection
- it is basically used for inter-conversion between collection objects
CopyOnWriteArraySet examples:
CopyOnWriteArraySetDemo.java
package in.bench.resources.concurrent.collection; import java.util.Iterator; import java.util.concurrent.CopyOnWriteArraySet; public class CopyOnWriteArraySetDemo { public static void main(String[] args) { // // creating CopyOnWriteArraySet object of type String CopyOnWriteArraySet<String> cowas = new CopyOnWriteArraySet<String>(); // adding elements to COWAS cowas.add("Mumbai"); cowas.add("Tokyo"); cowas.add("Shanghai"); cowas.add(null); // 1st NULL cowas.add("Melbourne"); cowas.add("Mumbai"); // duplicate cowas.add("Centurion"); cowas.add(null); // 2nd NULL cowas.add("Singapore"); cowas.add("Tokyo"); // duplicate System.out.println("CopyOnWriteArraySet demo example:\n"); // get Iterator object Iterator<String> cities = cowas.iterator(); // iterate using while-loop while(cities.hasNext()){ System.out.println(cities.next()); } } }
Output:
CopyOnWriteArraySet demo example: Mumbai Tokyo Shanghai null Melbourne Centurion Singapore
From above output, it is clear that,
- COWAS maintains insertion-order
- Doesn’t allows duplicate elements
- Null insertion is possible with max cap of one
References:
- https://docs.oracle.com/javase/tutorial/collections/intro/
- https://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html
- https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html
- https://docs.oracle.com/javase/tutorial/essential/concurrency/collections.html
- https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.html
- https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArraySet.html
- https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArraySet.html
Happy Coding !!
Happy Learning !!