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
的线程安全实现版本。