线程安全的集合

Wu Jun 2020-01-01 14:43:49
Categories: > > Tags:

1 同步容器类

同步容器类实现线程安全的方式是: 将他们的状态封装起来,并对每个公有方法都进行同步,使得每次只有一个线程能访问容器的状态。

1.1 同步容器类的问题
1.2 迭代器与 ConcurrentModificationException
1.3 隐藏迭代器

封装对象的同步机制(同步代码)有助于确保实施同步策略(eg:用synchronizedSet包装HashSet)

2 Concurrent 集合

用并发容器来代替同步容器,可以极大地提高伸缩性并降低风险

java.util.concurrent包中 ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet 和 ConcurrentLinkedQueue。这些集合使用复杂的算法,通过允许并发地访问数据结构的不同部分来使竞争极小化。

集合返回弱一致性的迭代器,这意味着迭代器不一定能反映出它们被构造之后的所有的修改,但是,它们不会将同一个值返回两次,也不会抛出 CocurrentModificationException 异常。

2.1 ConcurrentHashMap

ConcurrentHashSet 是其适配器。

1)原子更新

1.8为 ConcurrentHashMap 提供更方便完成原子更新的方法。

2)批操作

1.8提供为 ConcurrentHashMap 提供一个批操作,即使有其它线程正在处理映射,这些操作也能安全执行,得到一个近似值。 有三种:搜索(search),规约(reduce),foreach

3 CopyOnWriteArrayList

CopyOnWrite 容器即写时复制的容器。写元素时先复制一个新容器,往新容器里写,然后将原容器引用指向新容器。

4 并行数组算法

1.8中 Arrays 类提供了大量并行化操作。

5 较早的线程安全集合

Java SE 1.2中,Vector 和 Hashtable 被弃用了。

任何集合类通过使用同步包装器变成线程安全的:

List<E> synchArrayList = Collections.synchronizedList(new ArrayList<E>());
Map<K, V> synchHashMap = Collections.synchronizedMap(new HashMap<K, V>());