16.9.2 包装线程不安全的集合

16.9.2 包装线程不安全的集合

前面介绍Java集合时所讲的ArrayListLinkedlistHashSetTreeSetHashMapTreeMap等都是线程不安全的,也就是说,当多个并发线程向这些集合中存、取元素时,就可能会破坏这些集合的数据完整性。

Collections的synchronizedXxx方法

如果程序中有多个线程可能访问以上这些集合,就可以使用Collections提供的类方法把这些集合包装成线程安全的集合
Collections提供了如下几个静态方法。

方法 描述
static <T> Collection<T> synchronizedCollection(Collection<T> c) 返回指定collection对应的线程安全的collection
static <T> List<T> synchronizedList(List<T> list) 返回指定List对象对应的线程安全的List对象。
static <K,​V> Map<K,​V> synchronizedMap(Map<K,​V> m) 返回指定Map对象对应的线程安全的Map对象。
static <T> Set<T> synchronizedSet(Set<T> s) 返回指定Set对象对应的线程安全的Set对象。
static <K,​V> SortedMap<K,​V> synchronizedSortedMap(SortedMap<K,​V> m) 返回指定SortedMap对象对应的线程安全的SortedMap对象。
static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s) 返回指定SortedSet对象对应的线程安全的SortedSet对象

代码 使用线程安全的HashMap

例如需要在多线程中使用线程安全的HashMap对象,则可以采用如下代码:

1
2
//使用Collectionss的synchronizedMap方法将一个普通的HashMap包装成线程安全的类
HashMap m=Collections.synchronizedMap(new HashMap());

创建后就包装

如果需要把某个集合包装成线程安全的集合,则应该在创建之后立即包装