写点什么

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

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

关注

评论

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

简直了!顶级架构师分享心得,如何在项目中兼容多种数据库

犬来八荒

Java MySQL 数据库 面试

马匹、马镫、马车,和华为的数据基础设施革新

脑极体

一个简单的技术选型心得

i风语

Java 架构

Redis系列(五):你要的Redis集群搭建来了,实践与否你自己选!

z小赵

Java redis 分布式 高并发

猿灯塔:疫情冲击,去体验远程面试被怼10分钟,今年Java开发找工作真难

猿灯塔

游戏夜读 | 互动剧的黎明到了?

game1night

为什么我建议你读一读历史?

Phoenix

历史 中国历史

ARTS Week6

时之虫

ARTS 打卡计划

分布式缓存

Axe

农产品电商平台的S曲线分析

石云升

增长 S型曲线 破局点

向女朋友解释乐观锁与悲观锁的小妙招!

小闫

spring 面试 Spring Cloud 乐观锁 悲观锁

架构师训练营第4周总结

aoeiuvzcs

六月我在工作中蜕变,勤奋小人打架终于赢了

程序员小跃

效率工具 加班 沟通 复盘

理解 Mysql 索引底层原理只需这一篇就够了

小谈

MySQL 数据结构 面试 Spring Cloud Spring Boot

Android架构组件-App架构指南,你还不收藏嘛

小吴选手

架构 架构师 架构总结 架构要素 P7架构师

面试细节: i = i++和 i = ++i

Java小咖秀

面试 JVM 经验分享

锦囊篇|一文摸懂SharedPreferences和MMKV(二)

ClericYi

java架构-一些设计上的基本常识

猿灯塔

Java

第四周

仪轩

程序员的晚餐 | 7 月 3 日 好久没做饭

清远

美食

阿里技术官:这样带你学Spring全家桶,其实没你想的那么难

小吴选手

spring Spring Cloud Spring Boot

Go: 字符串和转换优化

陈思敏捷

string 字符串 Go 语言

高承实:区块链在新基建中的作用和未来发展

CECBC

新基建 政策扶持 技术特征 链上数据 产业场景

Week5命题作业

星河寒水

极客大学架构师训练营

深入理解编译优化之循环展开和粗化锁

程序那些事

JIT 编译优化 循环展开 粗化锁

测试开发工程师修炼手册—测试技能大盘点

Zoe

测试工程师产出

Redis分布式锁课堂开课了!

小闫

redis Spring Cloud Redis项目

我是如何解决邮件焦虑的

vinkyqy

效率 职场 邮件

18个Java8日期处理的实践,太有用了建议收藏

码哥小胖

MySQL SQL语法 sql查询

太牛 了!快码住!GitHub上标星75k!超牛的《Java面试突击版》

犬来八荒

Java git Linux 面试

逆袭之路,普通二本的八年开发码农如何进阿里拿年薪百万

小谈

Java 面试

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