Article Categories
- All Categories
-
Data Structure
-
Networking
-
RDBMS
-
Operating System
-
Java
-
MS Excel
-
iOS
-
HTML
-
CSS
-
Android
-
Python
-
C Programming
-
C++
-
C#
-
MongoDB
-
MySQL
-
Javascript
-
PHP
-
Economics & Finance
Difference between Traditional Collections and Concurrent Collections in java
In Java, Collections are fundamental data structures that store and manipulate groups of objects efficiently. However, traditional collections like ArrayList and HashMap are not designed for multi-threaded environments. To overcome this, Java 5 introduced Concurrent Collections in the java.util.concurrent package, providing thread-safe alternatives with better performance.
Traditional Collections
Traditional collections (from java.util) include classes like ArrayList, LinkedList, HashMap, and HashSet. They are not synchronized by default. While synchronized wrappers and legacy classes like Vector and Stack exist, they lock the entire collection, causing performance bottlenecks in multi-threaded scenarios.
Concurrent Collections
Concurrent collections (from java.util.concurrent) were introduced in JDK 1.5. They include classes like ConcurrentHashMap, CopyOnWriteArrayList, and ConcurrentLinkedQueue. These use partial locking (segment-level or lock-free algorithms) instead of locking the entire collection, providing much better throughput in multi-threaded applications.
Key Differences
| Feature | Traditional Collections | Concurrent Collections |
|---|---|---|
| Thread Safety | Not synchronized (ArrayList, HashMap) | Thread-safe by design |
| Locking | Full collection lock (Vector, Stack) | Partial/segment locking or lock-free |
| Concurrent Modification | Throws ConcurrentModificationException
|
Allows modification during iteration |
| Performance (Multi-threaded) | Poor (contention on single lock) | High (fine-grained locking) |
| Introduced In | JDK 1.2 | JDK 1.5 |
| Package | java.util |
java.util.concurrent |
| Key Classes | ArrayList, HashMap, Vector, Stack | ConcurrentHashMap, CopyOnWriteArrayList, ConcurrentLinkedQueue |
Example
The following example shows the difference − traditional ArrayList throws an exception when modified during iteration, while CopyOnWriteArrayList handles it safely ?
import java.util.ArrayList;
import java.util.concurrent.CopyOnWriteArrayList;
public class CollectionDemo {
public static void main(String[] args) {
// Concurrent Collection - safe during iteration
CopyOnWriteArrayList<String> concurrentList = new CopyOnWriteArrayList<>();
concurrentList.add("A");
concurrentList.add("B");
concurrentList.add("C");
System.out.println("CopyOnWriteArrayList (concurrent):");
for (String item : concurrentList) {
if (item.equals("B")) {
concurrentList.add("D"); // No exception
}
System.out.println(" " + item);
}
System.out.println(" Final: " + concurrentList);
// Traditional Collection - throws exception
System.out.println("\nArrayList (traditional):");
ArrayList<String> traditionalList = new ArrayList<>();
traditionalList.add("X");
traditionalList.add("Y");
traditionalList.add("Z");
try {
for (String item : traditionalList) {
if (item.equals("Y")) {
traditionalList.add("W"); // Throws exception
}
System.out.println(" " + item);
}
} catch (Exception e) {
System.out.println(" Exception: " + e.getClass().getSimpleName());
}
}
}
The output of the above code is ?
CopyOnWriteArrayList (concurrent): A B C Final: [A, B, C, D] ArrayList (traditional): X Y Exception: ConcurrentModificationException
Conclusion
Traditional collections are suitable for single-threaded applications but cause issues in multi-threaded environments. Concurrent collections provide thread safety with fine-grained locking and allow safe modification during iteration, making them the preferred choice for concurrent programming in Java.
