Close

Java Collections - Collections.synchronizedCollection() Examples

Java Collections Java Java API 


Class:

java.util.Collections

java.lang.Objectjava.lang.Objectjava.util.Collectionsjava.util.CollectionsLogicBig

Method:

public static <T> Collection<T> synchronizedCollection(Collection<T> c)

Returns a synchronized (thread-safe) collection backed by the specified collection.


Examples


Without synchronizedCollection.

package com.logicbig.example.collections;

import java.util.Collection;
import java.util.ConcurrentModificationException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class SynchronizedCollectionExample {

public static void main(String... args) throws InterruptedException {

Collection<Integer> collection = IntStream.rangeClosed(1, 10000)
.boxed()
.collect(Collectors.toList());
System.out.println("initial size: " + collection.size());

final ExecutorService e = Executors.newFixedThreadPool(10000);
for (int i = 0; i < 10000; i++) {
e.execute(() -> {
try {
Integer first = collection.iterator().next();
collection.remove(first);
} catch (ConcurrentModificationException e1) {
System.out.println(e1);
}
});
}
e.shutdown();
e.awaitTermination(1000, TimeUnit.SECONDS);
System.out.println(collection.size());//should be zero
}
}

Output

initial size: 10000
java.util.ConcurrentModificationException
java.util.ConcurrentModificationException
java.util.ConcurrentModificationException
java.util.ConcurrentModificationException
java.util.ConcurrentModificationException
java.util.ConcurrentModificationException
java.util.ConcurrentModificationException
java.util.ConcurrentModificationException
17




Using synchronizedCollection

package com.logicbig.example.collections;

import java.util.Collection;
import java.util.Collections;
import java.util.ConcurrentModificationException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class SynchronizedCollectionExample2 {

public static void main(String... args) throws InterruptedException {

Collection<Integer> c = IntStream.rangeClosed(1, 10000)
.boxed()
.collect(Collectors.toList());
Collection<Integer> collection = Collections.synchronizedCollection(c);
System.out.println("initial size: " + collection.size());

final ExecutorService e = Executors.newFixedThreadPool(10000);
for (int i = 0; i < 10000; i++) {
try {
Integer first = collection.iterator().next();
collection.remove(first);
} catch (ConcurrentModificationException e1) {
System.out.println(e1);
}
}
e.shutdown();
e.awaitTermination(1000, TimeUnit.SECONDS);
System.out.println(collection.size());//should be zero
}
}

Output

initial size: 10000
0




See Also