Returns a synchronized (thread-safe) collection backed by the specified collection.
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