Java Collections Java Java API
java.util.Collections
public static <K,V> NavigableMap<K,V> synchronizedNavigableMap(NavigableMap<K,V> m)
Returns a synchronized (thread-safe) NavigableMap backed by the specified NavigableMap.
package com.logicbig.example.collections;import java.util.NavigableMap;import java.util.Random;import java.util.TreeMap;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;public class SynchronizedNavigableMapExample { private static AtomicInteger counter = new AtomicInteger(); public static void main(String... args) throws InterruptedException { NavigableMap<Integer, Integer> map = new TreeMap<>(); final ExecutorService e = Executors.newFixedThreadPool(10); for (int i = 0; i < 10; i++) { e.execute(() -> map.put(counter.incrementAndGet(), (int) (Math.random() * 100))); } e.shutdown(); e.awaitTermination(1000, TimeUnit.SECONDS); System.out.println(map.size());//should be 10 }}
8
Using Collections.synchronizedNavigableMap:
package com.logicbig.example.collections;import java.util.Collections;import java.util.NavigableMap;import java.util.TreeMap;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;public class SynchronizedNavigableMapExample2 { private static AtomicInteger counter = new AtomicInteger(); public static void main(String... args) throws InterruptedException { NavigableMap<Integer, Integer> m = new TreeMap<>(); NavigableMap<Integer, Integer> map = Collections.synchronizedNavigableMap(m); final ExecutorService e = Executors.newFixedThreadPool(10); for (int i = 0; i < 10; i++) { e.execute(() -> map.put(counter.incrementAndGet(), (int) (Math.random() * 100))); } e.shutdown(); e.awaitTermination(1000, TimeUnit.SECONDS); System.out.println(map.size());//should be 10 }}
10