Skip to main content

Java collection series - CopyOnWriteArrayList

CopyOnWriteArrayList is a special purpose implementation of the List interface to better handle concurrency. It was introduced with Java 1.5 as a part of the java.util.concurrent package.

Why existing thread safe implementations aren't good enough?
  • synchronizedList from the Collections class locks the whole List which is bad performance as at any single point of time a single thread can access the collection
  • the Vector implementation also has poor performance as thread safety is achieved by synchronizing all the methods of the class
How is CopyOnWriteArrayList different?
Thread safety is handled in CopyOnWriteArrayList by making a copy of the underlying array whenever any mutation is performed (add, set, remove etc) in the list. This behavior is evident in the name of the collection as well. Now this brings us to the question if this list has costly affair or not as it makes copies for every change in the collection. The answer is YES and hence it's good for the cases where more read than write is performed.

Iterator behavoir
  • Iterator and ListIterator from CopyOnWriteArrayList are fail-safe meaning that these iterators will not throw ConcurrentModificationException, making it thread safe
  • these iterations use a reference to the state of the array at the point of iterator creation
  • the array that the iterators point to never changes as any change in the collection results in a new array and hence, the changes in the collection are not visible through the iterator (making it the snapshot style iterator)
  • these iterators do not support operations which alter the collection and any such operation results in UnsupportedOperationException

Comments

Popular posts from this blog

Working in India

The day I started working in SRA India(Indian arm of Japan's Software Research Associates, Inc ), I never thought that I world become an onsite team member in just one and half years. Because, the branch was very small & it was very illogical for a novice like me to think of an onsite tour that time. But the fact was that they would make you do your work in almost Japanese style. The very first day I started coding in SRA India, I was told that the Japanese were simply put - perfectionists. This simple word had a very large inner meaning. The code that you wrote should be totally bug free, robust, modifiable without introducing regression etc. The first project I was assigned to, it took a hell lot days to prepare only the detailed design(Java Doc) for a very tiny function, every molecular level detail was described on that. But somehow I made myself adjusted to such work environment. My performance was good in my batch. And in one day, one of my managers told me of an onsite a...

Java collection series - miscellaneous

Java Vector is a legacy class. And it is significantly faster in comparison to a list obtained through Collections.synchronizedList(). Vector has loads of legacy operations and hence the manipulations in Vector needs to be done through the List interface, otherwise you won't be able to replace the implementation at a later time. Arrays.asList() is better choice if the list is of fixed size and any kind of size mutation of the collection results in UnsupportedOperationException. The underlying array is updated whenever the list is updated (or vice-versa), but the array reference isn't retained. Collections.nCopies() is another convenient mini-implementation which can be useful in two ways - initialize a newly created list with n null values (need not be only null values) -  new ArrayList (Collections.nCopies(1000, (Type)null)  grow an existing list -  lovablePets.addAll(Collections.nCopies(69, "fruit bat")) Collections.singleton()/Collectio...

DB transaction ACID properties

DB transaction is a combination of different operations. If not performed in a proper manner, different transactions working on the same data at the same time may leave the data in corrupted state, effecting the application. In this article, I am going to illustrate DB transaction ACID properties through an example of money transfer application between two different accounts A and B. To begin with, lets suppose that accounts A and B both have initial balance of $100. ACID stands for Atomicity , Consistency , Isolation and Durability . Let's try to understand these one by one. Atomicity : This is the property that mandates that if a transaction is started, either all the operations which are part of the transaction need to be completed by end of the transaction completion as a single unit of work or none of the operations needs to be completed. It is maintained by transaction management component. If a debit of $10 is made from account A, then the corresponding credit of $10 al...