java.util.concurrent包提供了映射、有序集和队列的高效实现:ConcurrentHashMap、ConcurrentSkipListMap 、ConcurrentSkipListSet和ConcurrentLinkedQueue。
通过允许并发地访问数据结构二点不同部分来使竞争极小化。
集合返回弱一致性的迭代器。迭代器不一定能反映出它们被构造之后所有的修改,但是,他们不会将同一值返回两次,也不会抛出ConcurrentModificationException。
java.util.concurrent.ConcurrentLinkedQueue<E> ·可以被多线程安全访问的无边界非阻塞的队列。 java.util.concurrent.ConcurrentLinkedQueue<E> ·ConcurrentSkipListSet<E>(); 被多线程安全访问的有序集。 java.util.concurrent.ConcurrentHashMap<K,V> ·被多线程安全访问的散列映射表。 java.util.concurrent.ConcurrentSkipListMap<K,V> ·被多线程安全访问的有序映像表。
14.7.2映射条目的原子更新
操作序列不是原子的,所以结果不可预知。replace操作会以原子方式用一个新值替换原值。
computeIfPresent和computeIfAbsent方法,分别只在已经有原值的情况下计算新值,或者在没有原值的情况下计算新值。
14.7.3对并发散列映射的批操作
Java SE8为并发散列映射提供了批操作,即使有其它线程在处理map,这些操作也能安全执行。
有3种不同的操作:
- 搜索(search) 为每个键或者值提供一个函数,直到生成一个非null的结果。然后搜索终止,返回这个函数的结果。
- 归约(reduce)组合所有的键或者值,主要使用所提供的一个累加函数。
- forEach为所有键值提供一个函数。
每个操作都有4个版本:
- operationKeys:处理键
- operationValues:处理值
- operation:处理键和值
- operationEntries:处理Map.Entry对象
对于上述各个操作,需要指定一个参数化阈值。如果映射包含的元素多于这个阈值,就会并行完成批操作。如果希望批操作在一个线程种运行,可以使用阈值Long.MAX_VALUE。如果希望用尽可能多的线程运行批操作,可以使用阈值1。
ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap<>(); map.put("66",666); map.put("77",777); map.put("888",888); String result = map.search(2,(k,v) -> v > 667 ? k: null); String result1 = map.searchKeys(1,k -> k.length() > 1 ? k : "666");
对于int long 和double输出还有相应的特殊化操作,后缀分别有ToInt和ToLong还有ToDouble。
14.7.4并发集视图
Set<String> words = ConcurrentHashMap.<String>newkeySet();
14.7.5写数组的拷贝
CopyOnWriteArrayList和CopyOnWriteArraySet是线程安全的集合,其中所有的修改线程对底层数据进行复制。
14.7.6并行数组算法
Arrays.parallelSort
14.7.7 较早的线程安全集合
从Java的初版本开始,Vector和Hashtasble类就提供了线程安全的动态数组和散列表的实现。现在这些类被弃用了,取而代之的是ArrayList和HashMap类。这些类不是线程安全的,而集合库种提供了不同的机制。任何集合类都可以通过使用同步包装器(synchronization wrapper)变成线程安全的:
最好使用java.util.concurrent包中定义的集合,不使用同步包装器中的。特别是,假如它们访问的是不同的桶,由于ConcurrentHashMap已经精心地实现了,多线程可以访问它而且不会彼此阻塞。有一个例外是经常被修改的数组列表。在那种情况下,同步的ArrayList可以胜过CopyOn WriteArrayList。
API java.util.Collections ● static <E> Collection<E> synchronizedCollection(Collection<E> c) ● static <E> List synchronizedList(List<E> c) ● static <E> Set synchronizedSet(Set<E> c) ● static <E> SortedSet synchronizedSortedSet(SortedSet<E> c) ● static <K, V> Map<K, V> synchronizedMap(Map<K,V> c) ● static <K, V> SortedMap<K, V> synchronizedSortedMap( SortedMap<K, V> c) 构建集合视图,该集合的方法是同步的。