写点什么

Java SE 8 在并发工具方面的加强

  • 2014-04-18
  • 本文字数:1355 字

    阅读完需:约 4 分钟

Java 8 在 Lambda 表达式、接口默认方式、新的日期 API 等方面引入的新特性广受关注,同时在并发编程方面也做出了大量改进。以往的几个 Java 版本都对 java.util.concurrent 做了不同程度的增强,比如 Java 7 的 Fork/Join 框架,而 Java 8 则进一步在 java.util.concurrent 下增加了新的接口、类与方法。目前 java.util.concurrent 的官方文档已经更新,变更部分总结如下:

新的类以及接口

java.util.concurrent 中增加了两个接口四个类:

  1. CompletableFuture.AsynchronousCompletionTask 接口:标识在 async 方法中执行的异步任务。
  2. CompletionStage接口:异步计算中可能出现的一个阶段,也就是说当一个 CompletionStage 完成时执行的动作或计算。
  3. CompletableFuture类:一个可以确定完成状态的 Future。有关 CompletableFuture 的详细用法可参考 NoBlogDefFound 上的《 Java 8: CompletableFuture in action 》一文。
  4. ConcurrentHashMap.KeySetView<K,V> 类:ConcurrentHashMap 的键的集合视图。
  5. CountedCompleter类:一个在没有其他 action 等待的情况下,会执行一个完成 action 的 ForkJoinTask 。
  6. CompletionException 类:异常类。

ConcurrentHashMap 增加新方法

在 Java 8 中,集合框架基于 streams 和 Lambda 表达式做了全新调整:

ConcurrentHashMap 增加了 30 多个方法,包括 foreach 系列(forEach,forEachKey, forEachValue, forEachEntry)、search 系列(search, searchKeys, searchValues, searchEntries)、reduce 系列(reduce, reduceToDouble, reduceToLong)以及 mappingCount 、newKeySet 等方法, 增强后的 ConcurrentHashMap 更适合做缓存了, 读者可以看看这篇用 ConcurrentHashMap 类和 lambda 表达式实现本地缓存的文章。

java.util.concurrent.atomic 包的改进

java.util.concurrent.atomic 包中增加了四个新的类:DoubleAccumulator、DoubleAdder、LongAccumulator、 LongAdder,这四个类的作者是并发大师 Doug lea。

原有的 Atomic 系列类通过 CAS 来保证并发时操作的原子性,但是高并发也就意味着 CAS 的失败次数会增多,失败次数的增多会引起更多线程的重试,最后导致 AtomicLong 的效率降低。新的四个类通过减少并发,将单一 value 的更新压力分担到多个 value 中去,降低单个 value 的“热度”以提高高并发情况下的吞吐量,京东的刘锟洋详细分析了LongAdder 的源代码,另外minddotout 的博主在早些时候对LongAdder、AtomicLong 进行了性能测试,我们从结果中也可以直观的看到 LongAdder 的强大。

ForkJoinPool 中增加新方法

Java 8 除了对 Fork-Join 框架做了优化外,也为 ForkJoinPool 增加了两个静态方法:getCommonPoolParallelism() 、commonPool(),Oleg Shelajev在这篇博文中对Fork/Join 做了详细的介绍并做了测试以比较其在JDK7、JDK8 中的性能。

增加StampedLock 类

StampedLock 是一种新型锁的实现,很可能在大多数场景都可以替代 ReentrantReadWriteLock 。它为读写操作提供了三种模式:Writing、ReadingOptimistic、 Reading。

有关 Java 8 并发编程方面特性的详细介绍可从官方文档获取。


感谢杨赛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-04-18 01:325595
用户头像

发布了 219 篇内容, 共 140.5 次阅读, 收获喜欢 192 次。

关注

评论

发布
暂无评论
发现更多内容

这是我在银四拿到的第6个offer!分享我的成功秘籍:阿里巴巴 Java 面试参考指南(2021 最新版)

Java 程序员 架构 面试

华为内部论坛爆火的一份:Java面试培训笔记,秒变资深面试官

Java架构师迁哥

21分钟 MySQL 入门教程

???

MySQL 编程

限时分享:Alibaba技术官整理出来的Java零基础学习笔记

Java架构师迁哥

架构训练营模块 5 作业

Geek_649372

架构实战营

【Flutter 专题】119 图解简易 ACEFrameAnimated 帧动画

阿策小和尚

5月日更 Flutter 小菜 0 基础学习 Flutter Android 小菜鸟

有点东西,GC与内存泄漏之间的联系分不清,居然也可以进微软?

Java架构师迁哥

爆赞!GitHub上首本IntelliJ IDEA操作手册,标星果然百万名不虚传

Java 编程 程序员 架构师 IntelliJ IDEA

随机数在区块链中的应用

CECBC

消息队列并不能解耦

Xargin

Spark如何进行动态资源分配

数据社

spark 5月日更

🔎【Java源码探索】深入浅出的分析 ThreadPoolExecutor

洛神灬殇

Java 线程池工作原理 ThreadPoolExecutor 5月日更 Worker

人生算法:复利,营造长期的局部垄断

石云升

读书笔记 思维模型 5月日更 人生算法

LogBack 日志等级设置无效,原因竟然是因为这个

楼下小黑哥

spring springboot logback

已经成功拿到字节offer,阿里内部二十三万字 Java 面试题总结

Java 程序员 架构 面试

小王毕业两年转行学Java,现在过得比科班生过得还好?

Java架构师迁哥

原来真的有外卖员转行学Java,还三面“拿下”拼多多offer!

Java架构师迁哥

阿里内部面试手册,Github 上获赞 80K,无论工作几年都可以看看

Java 编程 架构 面试

通过混沌测试发现 HTTP/2 缺陷

卫智雄

ubuntu64 位搭建 OpenVINO 系统(下篇)

IT蜗壳-Tango

5月日更

Redis - 持久化

旺仔大菜包

redis

基于ECS搭建FTP服务

若尘

阿里云 服务器 5月日更

女裤裤兜如何影响工业设计?

脑极体

架构师实战营模块五

ifc177

Nginx利用resolver实现动态upstream

运维研习社

nginx 运维 5月日更 动态负载均衡

交叉验证

Qien Z.

5月日更 交叉验证

Java也太卷了,应届生找工作都需要准备这些知识点了!

Java架构师迁哥

21岁就走了“狗屎运”(4面拿字节跳动offer Java岗)

Java架构师迁哥

Redis集群JedisCluster的pipeline自定义实现

叫我阿柒啊

redis cluster pipeline JedisCluster lettuce redission

HashMap源码分析(一)

泽睿

源码分析 hashmap

SM和PO如何参与Daily Scrum——《Scrum指南》重读有感(3)

Bruce Talk

Scrum 敏捷 随笔 Agile

Java SE 8 在并发工具方面的加强_Java_小盖_InfoQ精选文章