2020-12-30

一、线程安全的集合(java.util.concurrent)
1、对并发散列映射的批操作
批操作会遍历映射,处理遍历过程中找到的元素。
a.3种操作:
搜索(search):为每个键或值提供一个函数,直到函数生成一个非null的结果,然后停止搜索,返回这个函数的结果(只有一个输出);
归约(reduce):组合所有键或值,使用所提供的一个累加函数;
forEach为所有键或值提供一个函数(k,v);
b.每个操作都有四个版本
operationKeys:处理键;
operationValues:处理值;
operation:处理键和值;
operationEntries:处理Map.Entry对象;
对于上述各个操作,需要指定一个参数化阈值。如果映射包含的元素多于这个阈值,就会并行完成批操作。例如,如果希望批操作在一个线程中运行,可以使用阈值Long.Max_VALUE;如果希望尽可能多的线程完成批操作则使用阈值1。
c.对于reduce与forEach操作,可以设置转换器来作为过滤器,通过返回null来排除不想要的输入。
注:
Java 8 中的函数式接口就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为lambda表达式。java.util.function包中包含了很多类用来支持函数式编程。例如,BiConsumer<T,U>:代表一个接受两个参数的操作,并且不会返回任何结果;BiFunction
<T,U,R>代表了一个接受两个输入参数的方法,并且返回一个结果。
lambda表达式可以使用方法引用来代替。
2、并发集视图
如果需要的是一个大的线程安全的集而不是映射。由于没有ConcurrentHashSet类,可以使用ConcurrentHashMap的静态方法newKeySet方法来把其作为一个集来使用(所有的映射值都为Boolean.TRUE)。
此外,对于原有的一个映射,keySet方法可以生成这个映射的键集。这个集可以删除,但是不能增加。另外,在JavaSE8中Keyset方法可以包含一个默认值,为集增加元素时使用。
在这里插入图片描述

3、写数组的拷贝
CopyOnWriteArrayList是ArrayList的线程安全版本。
CopyOnWriteSet是Set的线程安全版本。
它们是在有写操作的时候copy一份数据,然后写完再设置成新的数据,使用于读多写少的并发场景。
4、并行数组算法
在javaSE8中,Arrays提供了大量并行化操作。
Arrays.parallelSort()方法可以对一个基本类型值或对象的数组并行化排序;
Arrays.parallelSetAll()方法会由一个函数计算得到的值填充一个数组;
Arrays.parallelPrefix()方法会用对应一个给定结合操作的前缀的累加结果替换各个数组元素;
5、较早的线程安全集合
早期,Vector和Hashtable类就提供了线程安全的动态数组和散列表的实现。但现在这些类都弃用了。
任何集合类都可以通过使用同步包装类变成线程安全的。结果集合的方法使用锁加以保护,提供了线程安全访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值