写点什么

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:325432
用户头像

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

关注

评论

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

JavaScript 基础

卢衍飞

JavaScript 学习 技术交流 基础

瓴羊Quick BI,强劲数据引擎助力企业数据分析

夏日星河

BSN开放联盟链“武汉链”新版浏览器wuscan.io正式上线发布

BSN研习社

BSN 武汉链

为什么 NGINX 的 reload 不是热加载?

API7.ai 技术团队

Apache nginx 开源 api 网关 APISIX

Java 注解与反射 基础

卢衍飞

Java

深度分析React源码中的合成事件

goClient1992

React

转化10亿GMV:螺丝钉也能变小马达

博文视点Broadview

只需5步注册成为亚马逊云科技 Marketplace (海外区)专家

亚马逊云科技 (Amazon Web Services)

亚马逊云科技 Tech 专栏 Marketplace

火山引擎 DataTester 应用故事:一个A/B测试,将产品DAU提升了数十万

字节跳动数据平台

大数据 AB testing实战

【11.18-11.25】写作社区优秀技术博文回顾

InfoQ写作社区官方

热门活动

python常用内置函数用法精要(二)

乔乔

11月月更

Java 反射

卢衍飞

Java

从 Uber 数据泄露事件我们可以学到什么?

SEAL安全

数据安全 企业安全 PAM

链上挖矿分红智能合约DAPP系统开发部署模式定制

开发微hkkf5566

从源码角度看React-Hydrate原理

flyzz177

React

C++中的代码重用

Maybe_fl

聊一聊装饰者模式

Java 设计模式

一个PMO从0-1建设的工作思路 | 对你绝对有用!

PMO实践

项目管理 PMO

华为云区块链三大核心技术国际标准立项通过

华为云开发者联盟

区块链 华为云

看透react源码之感受react的进化

goClient1992

React

Spring中获取bean的八种方式,你get了几种?

小小怪下士

Java spring bean

React-Hooks源码深度解读

goClient1992

React

好好的系统,为什么要分库分表?

程序员小富

Java 数据库 面试 分库分表

从react源码看hooks的原理

flyzz177

React

Java 线程基础

卢衍飞

Java

横向对比主流BI软件优势,企业要按需选择

巷子

经营型项目经理是不是伪需求?

PMO实践

项目管理 敏捷 PMO 项目经理

HDC2022的无障碍参会体验,手语服务是如何做到的?

HMS Core

HMS Core

从recat源码角度看setState流程

flyzz177

React

ISV 的亚马逊云科技 marketplace ( 中国区) 之旅

亚马逊云科技 (Amazon Web Services)

亚马逊云科技 Tech 专栏 Marketplace

云原生系列 【轻松入门容器基础操作】

叶秋学长

云原生 沙箱实验 11月月更

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