跳到主要内容

JEP 155:并发更新

概括

可扩展的可更新变量、面向缓存的ConcurrentHashMapAPI 增强、ForkJoinPool改进以及附加LockFuture

动机

应用程序中并发性和并行性使用的不断发展需要库支持的不断发展。这里描述的所有工作都是由软件包用户的经验和建议推动的java.util.concurrent

描述

  1. 可扩展的可更新变量。维护可能由多个线程更新的单个计数、总和等是一个常见的可扩展性问题。一小组新类 ( DoubleAccumulatorDoubleAdderLongAccumulatorLongAdder) 在内部采用了争用减少技术,与变量相比,这些技术提供了巨大的吞吐量改进Atomic。这是通过以大多数应用程序可接受的方式放宽原子性保证来实现的。

  2. 添加的功能(以及可能添加的 API)使得ConcurrentHashMaps从它们构建的类作为缓存更加有用。其中包括在键不存在时计算键值的方法,以及改进对扫描和可能逐出条目的支持,以及更好地支持具有大量元素的映射。

  3. 增加的功能和改进的性能使ForkJoinPool它们能够更有效地用于用户期望的越来越广泛的应用程序中。新功能包括支持基于完成的设计,这些设计通常最适合 IO 密集型用途等。

可能的进一步添加包括附加LockFuture类,以及重新考虑相关支持,以更好地支持 STM(软件事务内存)框架的构建。然而,STM 支持本身并不是 JDK 8 的目标。

这些组件的初步版本(以及对其他组件的其他小更新)已经并将继续在 OpenJDK 之外引入,以在集成到 JDK 8 之前征求早期反馈和体验报告(主要由专家用户提供)。 来源和邮件列表可以通过以下链接找到讨论:http://gee.cs.oswego.edu/dl/concurrency-interest/index.html

测试

我们(JSR 166 的持续成员)为所有组件提供功能和性能测试。

风险和假设

我们假设 Oracle 工程师将继续协助集成到 JDK 8。

依赖关系

有些功能依赖于 lambda 语法和常见函数类型的 JDK 声明,因此我们可能会推迟集成,直到我们对它们的最终形式更有信心为止。