揭秘 CompletedFuture 的设计精髓(基础)
CompletionStage 接口说明见 Java异步编程:CompletionStage接口详解-CSDN博客
细节深入分析(如completion的结构、postCompletion遍历图流程分析)见:揭秘 CompletedFuture 的设计精髓(深入实现分析)-CSDN博客
核心数据结构
-
volatile Object result
- 作用:存储异步任务的结果或异常(通过
AltResult
封装)。 - 编码规则:
- 正常结果直接存储(
null
编码为NIL
)。 - 异常通过
AltResult
包装(如new AltResult(ex)
)。
- 正常结果直接存储(
- 原子性保证:通过
RESULT.compareAndSet(this, null, r)
实现无锁更新。
- 作用:存储异步任务的结果或异常(通过
-
volatile Completion stack
- 作用:维护依赖操作的 Treiber 栈结构,所有依赖此结果的阶段(
Completion
)按 LIFO 顺序触发。 Completion
类型:- 单源依赖(
UniCompletion
):如thenApply
、thenAccept
。 - 双源依赖(
BiCompletion
):如thenCombine
、thenAcceptBoth
。 - 信号处理(
Signaller
):用于阻塞等待线程(如 get() 的阻塞唤醒)。
- 单源依赖(
- 作用:维护依赖操作的 Treiber 栈结构,所有依赖此结果的阶段(
完成与依赖触发机制
-
完成流程
complete(T value)
:- 调用
completeValue(value)
通过 CAS 设置result
。 - 触发
postComplete()
遍历stack
中的Completion
节点。
- 调用
postComplete()
方法:- 循环弹出栈顶节点,调用
tryFire(NESTED)
触发依赖操作。 - 递归处理新生成的依赖链(如
d.postFire(a, mode)
)。
- 循环弹出栈顶节点,调用
-
依赖操作触发(
tryFire
)- 模式参数:
SYNC
(同步)、ASYNC
(异步)、NESTED
(嵌套触发)。
- 示例:
UniApply.tryFire
:- 检查源结果是否就绪,应用函数
fn
生成新结果。 - 若成功,调用
d.postFire(a, mode)
清理资源并继续触发后续依赖。
- 检查源结果是否就绪,应用函数
- 模式参数:
异步任务与线程池
-
默认执行器