跳到主要内容

JEP 155:并发更新

QWen Max 中英对照

概述

可扩展的可更新变量、针对缓存优化的 ConcurrentHashMap API 增强、ForkJoinPool 改进,以及额外的 LockFuture 类。

动机

应用程序中对并发和并行的使用不断演变,这就需要库的支持也不断演变。这里描述的所有工作都受到 java.util.concurrent 包用户的经验和建议的推动。

描述

  1. 可扩展的可更新变量。维护一个可能被多个线程更新的单一计数、总和等,是一个常见的可扩展性问题。一小部分新类(DoubleAccumulatorDoubleAdderLongAccumulatorLongAdder)在内部采用了减少争用的技术,与 Atomic 变量相比,提供了巨大的吞吐量改进。这是通过以一种在大多数应用中可接受的方式放松原子性保证来实现的。
  2. 增加了使 ConcurrentHashMaps 及其衍生类作为缓存更加有用的功能(以及可能新增的 API)。这些功能包括在键不存在时计算值的方法,以及改进的扫描和可能的条目驱逐支持,同时更好地支持包含大量元素的映射。
  3. ForkJoinPool 增加了功能并提升了性能,使其能够更有效地应用于用户期望的日益广泛的应用场景中。新特性包括对基于完成的设计的支持,这通常最适合 IO 密集型使用场景等。

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

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

测试

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

风险与假设

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

依赖

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