14.7 线程安全的集合

       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)
   构建集合视图,该集合的方法是同步的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值