8.8.3 同步控制

8.8.3 同步控制

Collections类中提供了多个synchronizedXxx()方法,该方法可以将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题。

Java中常用的集合框架中的实现类HashSetTreeSetArrayListArrayDequeLinkedListHashMapTreeMap都是线程不安全的。如果有多个线程访问它们,而且有超过一个的线程试图修改它们,则存在线程安全的问题。

将集合包装成线程安全的方法

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
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.*;

public class SynchronizedTest
{
public static void main(String[] args)
{
// 下面程序创建了四个线程安全的集合对象
Collection c = Collections
.synchronizedCollection(new ArrayList());
List list = Collections.synchronizedList(new ArrayList());
Set s = Collections.synchronizedSet(new HashSet());
Map m = Collections.synchronizedMap(new HashMap());
}
}

如何获取线程安全的集合

在上面示例程序中,直接将新创建的集合对象传给了CollectionssynchronizedXxx()方法作为参数,这样就可以直接获取ListSetMap的线程安全实现版本