乐于分享
好东西不私藏

CompletableFuture 源码级原理 + 设计模式 终极整合版(面试封神)

CompletableFuture 源码级原理 + 设计模式 终极整合版(面试封神)

我把底层源码原理和设计模式完全打通,一一对应、逻辑闭环,让你彻底理解:

它是什么结构?怎么运行?用了哪些设计模式?为什么这么设计?

全程无废话,纯干货、可直接背、可直接面试。

一、CompletableFuture 本质(一句话)

CompletableFuture = 状态机(状态模式)+ 无锁并发回调栈(观察者模式)+ 流水线链式调度(责任链模式)+ 命令封装(命令模式)

它是一个异步任务容器

  1. 任务没完成时:存储回调

  2. 任务完成时:自动触发回调

  3. 全程非阻塞、高性能、基于 CAS 无锁实现

二、核心源码结构(最关键 3 个字段)

public class CompletableFuture<T> {    // 1. 任务结果 / 异常(状态机数据)    volatile Object result;    // 2. 回调链表(所有 thenApply/thenRun 都存在这里)    volatile Completion stack;    // 3. 任务状态:未完成 / 正常 / 异常 / 取消    static final int NORMAL, EXCEPTIONAL, CANCELLED;}

三、完整运行流程 + 对应设计模式

流程 1:创建异步任务

CompletableFuture.supplyAsync(() -> {    return queryDB(); // 耗时任务});

底层动作

  1. 创建空 CF,result = null → 未完成状态

  2. 任务封装成命令对象丢给线程池

  3. 立刻返回 CF,主线程不阻塞

对应设计模式

  1. 工厂模式:supplyAsync 负责创建实例

  2. 命令模式:任务被封装成可执行对象

  3. 策略模式:可指定线程池(执行策略)

流程 2:添加回调(thenApply /thenRun)

cf.thenApply(result -> {    return result.getName();});

底层动作

判断 CF 是否完成

已完成 → 立即执行回调

未完成 → 包装成 Completion 压入 stack 回调栈

对应设计模式

  1. 观察者模式:注册 “监听器”,等完成后通知

  2. 责任链模式:回调形成链式结构

  3. 命令模式:回调被封装成命令

流程 3:任务完成(setResult /complete)

complete(value);  // 赋值结果postComplete();   // 触发所有回调

底层动作

  • CAS 原子更新 result

  • 状态从 未完成 → 已完成

  • 遍历 stack,逐个弹出回调执行

对应设计模式

  1. 状态模式:状态切换,行为随之改变

  2. 观察者模式:任务完成 → 通知所有观察者(回调)

  3. 迭代器模式:遍历回调栈

  4. 责任链模式:依次执行流水线

流程 4:触发回调的灵魂方法:postComplete ()

final void postComplete() {    Completion h;    while ((h = stack) != null) {        // CAS 无锁弹出栈顶        if (casStack(h, h.next)) {            h.fire(); // 执行回调        }    }}

对应设计模式

  1. 观察者模式:发布通知

  2. 命令模式:执行命令(fire)

  3. 迭代器模式:遍历链表

  4. 无锁设计(CAS):高并发基石

四、设计模式 + 源码位置 + 作用 完整对照表

设计模式
源码体现
作用
观察者模式(核心)
stack 回调栈 + postComplete ()
任务完成自动触发回调,解耦生产者 / 消费者
责任链模式
thenApply/thenCompose 链式调用
流水线式异步处理,一步一步传递结果
状态模式
result + 状态(未完成 / 完成 / 异常)
不同状态下行为不同:未完成存回调,完成执行
命令模式
Completion 接口 + fire ()
把回调 / 任务封装成对象,统一执行
策略模式
可传入不同线程池
灵活切换同步 / 异步 / 自定义线程池
装饰器模式
thenApplyAsync
增强:给任务增加异步执行能力
工厂模式
supplyAsync/runAsync
封装 CompletableFuture 创建逻辑
迭代器模式
postComplete () 遍历 stack
安全遍历回调链

五、最核心 4 大模式(必须掌握)

1. 观察者模式(灵魂)

  • 任务 = 被观察者

  • 回调 = 观察者

  • 完成 = 发布事件

  • postComplete () = 事件派发

你不用轮询,完成自动通知你。

2. 状态模式(基础)

CompletableFuture 是状态机

未完成、正常完成、异常完成、取消

状态不同,行为完全不同。

3. 责任链模式(链式调用)

supplyAsync → thenApply → thenAccept → thenRun

像工厂流水线,一步处理完交给下一步。

4. 命令模式(封装任务)

  • 所有回调都被包装成 Completion

  • 统一调用 fire() 执行

  • 解耦任务定义与执行

六、底层高性能原理(面试必问)

  1. 无锁设计:全程 CAS,不使用 synchronized

  2. 回调栈(Treiber Stack):高并发下安全高效

  3. 任务共享:不阻塞线程,只注册回调

  4. 线程复用:基于线程池,不盲目创建线程

七、终极总结(可直接背诵)

CompletableFuture 源码原理

  1. 用 result 存储结果与状态(状态机)

  2. 用 stack 存储所有回调

  3. 未完成时注册回调

  4. 完成时CAS 更新状态 + 派发所有回调

  5. 全程非阻塞、事件驱动、无锁高性能

涉及设计模式(8 种)

观察者模式 + 责任链模式 + 状态模式 + 命令模式 + 策略模式 + 装饰器模式 + 工厂模式 + 迭代器模式

最核心 3 个

观察者(回调)+ 责任链(流水线)+ 状态(状态机)

最终一句话

CompletableFuture 就是一个基于状态机的、无锁的、事件驱动的、支持流水线链式回调的异步任务框架。