8.8.3 同步控制
8.8.3 同步控制
Collections类中提供了多个synchronizedXxx()方法,该方法可以将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题。
Java中常用的集合框架中的实现类HashSet、 TreeSet、 ArrayList、 ArrayDeque、 LinkedList、 HashMap和TreeMap都是线程不安全的。如果有多个线程访问它们,而且有超过一个的线程试图修改它们,则存在线程安全的问题。
将集合包装成线程安全的方法
Collections提供了多个类方法可以把它们包装成线程同步的集合,如下表所示。
| 方法 | 描述 | 
|---|---|
Collections.synchronizedCollection(Collection collection) | 
把Collection实例包装成线程安全的Collection。 | 
Collections.synchronizedList(List list) | 
把List实例包装成线程安全的List。 | 
Collections.synchronizedSet(Set set) | 
把Set实例包装成线程安全的Set。 | 
Collections.synchronizedMap(Map map) | 
把Map实例包装成线程安全的Map。 | 
| 方法 | 描述 | 
|---|---|
Collections.synchronizedNavigableMap(NavigableMap<K,V> m) | 
Returns a synchronized (thread-safe) navigable map backed by the specified navigable map. | 
Collections.synchronizedNavigableSet(NavigableSet<T> s) | 
Returns a synchronized (thread-safe) navigable set backed by the specified navigable set. | 
Collections.synchronizedSortedMap(SortedMap<K,V> m) | 
Returns a synchronized (thread-safe) sorted map backed by the specified sorted map. | 
Collections.synchronizedSortedSet(SortedSet<T> s) | 
Returns a synchronized (thread-safe) sorted set backed by the specified sorted set. | 
程序 将集合包装成线程安全的示例
下面的示例程序创建了4个线程安全的集合对象。
1  | import java.util.*;  | 
如何获取线程安全的集合
在上面示例程序中,直接将新创建的集合对象传给了Collections的synchronizedXxx()方法作为参数,这样就可以直接获取List、Set和Map的线程安全实现版本。