Java SE 8 在并发工具方面的加强
来源:互联网 发布:剑灵卡刀软件 编辑:程序博客网 时间:2024/06/08 12:31
Java 8在Lambda表达式、接口默认方式、新的日期API等方面引入的新特性广受关注,同时在并发编程方面也做出了大量改进。以往的几个Java版本都对java.util.concurrent做了不同程度的增强,比如Java 7的Fork/Join框架,而Java 8则进一步在java.util.concurrent下增加了新的接口、类与方法。目前java.util.concurrent的官方文档已经更新,变更部分总结如下:
新的类以及接口
java.util.concurrent 中增加了两个接口四个类:
- CompletableFuture.AsynchronousCompletionTask接口:标识在async方法中执行的异步任务。
- CompletionStage<T>接口:异步计算中可能出现的一个阶段,也就是说当一个CompletionStage 完成时执行的动作或计算。
- CompletableFuture<T>类:一个可以确定完成状态的Future。有关CompletableFuture的详细用法可参考NoBlogDefFound上的《Java 8: CompletableFuture in action》一文。
- ConcurrentHashMap.KeySetView<K,V>类:ConcurrentHashMap 的键的集合视图。
- CountedCompleter<T>类:一个在没有其他action等待的情况下,会执行一个完成action的 ForkJoinTask 。
- 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并发编程方面特性的详细介绍可从官方文档获取。
- Java SE 8 在并发工具方面的加强
- Java SE 6 在 HTTP 方面的新特性
- Java SE 6 在国际化方面的增强(ResourceBundle)
- java SE 加强
- java SE 加强2
- Java SE 加强(一)
- Java SE 加强内省、反射
- 11 java 王少飞-Java SE 加强小节
- Java SE 加强for和枚举
- Android在图形界面UI方面的工具
- java SE程序关于高并发的注意事项
- JAVA SE 8 学习笔记(五)并发增强
- java--加强之 Java5的线程并发库
- Java基础加强之 Java5的线程并发库
- .NET方面应该加强的一些技能.
- 2013年需加强的几个方面
- 11 java 王少飞-Java SE 加强 内省小节
- 11 java 王少飞-java SE 加强 反射小节
- SQL Server 触发器
- ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
- LVS和Heartbeat的安装配置说明
- IOS高级编程(网络编程一)
- iOS7适配问题总结
- Java SE 8 在并发工具方面的加强
- 基因芯片(Affymetrix)分析1:芯片质量分析
- Java 单例模式详解
- 迷宫问题递归与非递归求解
- Javascript刷新页面的几种方法
- Innovation - 秘密 - 不同于微信和陌陌
- Git命令
- 京东国际化,首战俄罗斯?
- IOS应用/游戏 项目封装之:UILabel 应该如何拓展?