JEP 155:并发更新
概括
可扩展的可更新变量、面向缓存的ConcurrentHashMap
API 增强、ForkJoinPool
改进以及附加Lock
类Future
。
动机
应用程序中并发性和并行性使用的不断发展需要库支持的不断发展。这里描述的所有工作都是由软件包用户的经验和建议推动的java.util.concurrent
。
描述
-
可扩展的可更新变量。维护可能由多个线程更新的单个计数、总和等是一个常见的可扩展性问题。一小组新类 (
DoubleAccumulator
、DoubleAdder
、LongAccumulator
、LongAdder
) 在内部采 用了争用减少技术,与变量相比,这些技术提供了巨大的吞吐量改进Atomic
。这是通过以大多数应用程序可接受的方式放宽原子性保证来实现的。 -
添加的功能(以及可能添加的 API)使得
ConcurrentHashMaps
从它们构建的类作为缓存更加有用。其中包括在键不存在时计算键值的方法,以及改进对扫描和可能逐出条目的支持,以及更好地支持具有大量元素的映射。 -
增加的功能和改进的性能使
ForkJoinPool
它们能够更有效地用于用户期望的越来越广泛的应用程序中。新功能包括支持基于完成的设计,这些设计通常最适合 IO 密集型用途等。
可能的进一步添加包括附加Lock
和Future
类,以及重新考虑相关支持,以更好地支持 STM(软件事务内存)框架的构建。然而,STM 支持本身并不是 JDK 8 的目标。
这些组件的初步版本(以及对其他组件的其他小更新)已经并将继续在 OpenJDK 之外引入,以在集成到 JDK 8 之前征求早期反馈和体验报告(主要由专家用户提供)。 来源和邮件列表可以通过以下链接找到讨论:http://gee.cs.oswego.edu/dl/concurrency-interest/index.html
测试
我们(JSR 166 的持续成员)为所有组件提供功能和性能测试。
风险和假设
我们假设 Oracle 工程师将继续协助集成到 JDK 8。
依赖关系
有些功能依赖于 lambda 语法和常见函数类型的 JDK 声明,因此我们可能会推迟集成,直到我们对它们的最终形式更有信心为止。