16.9.2 包装线程不安全的集合
16.9.2 包装线程不安全的集合
前面介绍Java
集合时所讲的ArrayList
、Linkedlist
、HashSet
、TreeSet
、HashMap
、TreeMap
等都是线程不安全的,也就是说,当多个并发线程向这些集合中存、取元素时,就可能会破坏这些集合的数据完整性。
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 | //使用Collectionss的synchronizedMap方法将一个普通的HashMap包装成线程安全的类 |
创建后就包装
如果需要把某个集合包装成线程安全的集合,则应该在创建之后立即包装