# 1. AIO 在 Spring WebFlux 的应用 A WebFlux 基于 Netty 的事件循环(NIO 多路复用)实现非阻塞,而非依赖 JDK AIO ✓ 正确答案 B WebFlux 使用 JDK AIO 作为核心 C WebFlux 采用线程-per-请求 D WebFlux 与背压无关
# 2. Reactor 的 Context 如何替代 ThreadLocal 在订阅链中逆向传播,为什么它与调用线程无关 A Context 绑定线程,线程切换丢失 B Context 随订阅链逆向传播,与执行线程无关,线程切换也不丢失 ✓ 正确答案 C Context 与 ThreadLocal 相同 D Context 只能从上游到下游
# 3. Reactor 的背压(Backpressure)如何通过 request(n) 协议向上游传递需求,onBackpressureBuffer/Drop/Latest 各自适用什么场景 A request(n) 与背压无关 B 背压是上游强推 C 三种操作符行为相同 D 下游 request(n) 向上游传递需求,Buffer 缓冲、Drop 丢弃、Latest 保留最新,按场景选择 ✓ 正确答案
# 4. WebFlux 基于 Netty EventLoop 的线程模型为何禁止阻塞调用,一次 JDBC 阻塞会怎样拖垮整个事件循环 A 阻塞调用只影响当前请求 B EventLoop 线程被阻塞会拖垮其所有连接,阻塞调用应隔离到 boundedElastic 或改用非阻塞 ✓ 正确答案 C EventLoop 有多个线程,阻塞无影响 D JDBC 阻塞是安全的
# 5. 使用 NIO Selector 实现的简易 HTTP 服务器与 Spring WebFlux 的背压控制相比,吞吐量上限有多大差距 A 两者吞吐完全相同 B 差距主要来自背压控制与事件循环优化,而非非阻塞 IO 本身 ✓ 正确答案 C 简易实现背压更好 D WebFlux 无用
# 6. 虚拟线程(Project Loom)出现后,"是否还需要 Reactive/WebFlux"成为 Java 后端最热争论——两者的适用场景边界如何划分? A Reactive 无法处理流式 B 虚拟线程使 Reactive 完全无用 C 虚拟线程解决并发,Reactive 解决流式/背压/非阻塞,二者互补按业务选型 ✓ 正确答案 D 虚拟线程能模拟背压
# 7. 已有 WebFlux/Reactor 代码库迁移到虚拟线程的渐进策略,哪些模块先迁、哪些保留 Reactive,双栈共存期间的注意事项如何? A 简单阻塞业务先迁,流式/背压模块保留 Reactive,双栈共存需边界清晰与资源隔离 ✓ 正确答案 B 所有模块一次性迁移 C 先迁流式模块 D 双栈共存无注意事项
# 8. Spring Boot 3.2+ 中 spring.threads.virtual.enabled=true 开启后,Spring MVC 的线程模型如何变化?与 WebFlux 的功能差异还剩什么? A MVC 虚拟线程获得并发,但 WebFlux 的流式、背压、非阻塞组合仍不可替代 ✓ 正确答案 B 开启后 MVC 与 WebFlux 完全等价 C MVC 也能做背压 D 差异在并发能力
# 9. 虚拟线程的 thread-per-request 模型与 Reactive 的 event-loop 模型在吞吐量、延迟、资源占用上的实测对比数据如何解读? A 两者资源占用相同 B 虚拟线程吞吐远低于 Reactive C Reactive 内存占用最低 D IO 密集场景吞吐接近,虚拟线程内存更省代码更简单,Reactive 在流式/极低延迟有优势 ✓ 正确答案
# 10. JEP 491 修复前 synchronized 与 JNI 阻塞导致的虚拟线程钉住(pinning)如何影响 Reactive 选型决策?如何检测和规避? A 钉住不影响并发 B 钉住使虚拟线程在 synchronized/JNI 阻塞时无法让出载体线程,JEP 491 修复 synchronized 钉住 ✓ 正确答案 C JEP 491 只修复 JNI D 无法检测钉住
# 11. publishOn 与 subscribeOn 对订阅链中线程切换的作用范围与执行位置差异 A 两者都只影响下游 B subscribeOn 影响订阅与上游执行,publishOn 影响其下游 operator 的执行线程 ✓ 正确答案 C subscribeOn 影响下游 D 两者作用完全相同
# 12. 响应式事务为何不能用基于 ThreadLocal 的 @Transactional,TransactionalOperator 与 @Transactional 在 R2DBC 下的编程差异 A 响应式线程切换使 ThreadLocal 的 @Transactional 失效,R2DBC 用 TransactionalOperator 编程式管理事务 ✓ 正确答案 B @Transactional 在 R2DBC 下可用 C TransactionalOperator 基于 ThreadLocal D 响应式事务与线程无关
# 13. 在响应式链路中需要调用阻塞库时,boundedElastic 调度器的作用与线程上限、队列拒绝行为如何配置 A 阻塞调用无需隔离 B 阻塞调用应在事件循环线程执行 C boundedElastic 无界 D 用 subscribeOn(boundedElastic) 隔离阻塞调用,有界线程上限防资源耗尽 ✓ 正确答案
# 14. 如何用可控分片、慢消费者和连接重置测试 Selector 服务的半包、背压与故障清理语义 A 背压无需测试 B 半包与分片无关 C 可控分片测半包重组、慢消费者测背压、连接重置测故障清理 ✓ 正确答案 D 连接重置无需清理
# 15. Mono 与 Flux 的语义差异是什么,empty/just/defer/fromCallable 等工厂方法在订阅时机上有何不同 A 所有工厂方法都立即执行 B Mono 与 Flux 相同 C Mono 0-1 元素、Flux 0-N 元素,defer/fromCallable 延迟到订阅时执行,just/empty 立即 ✓ 正确答案 D defer 立即执行
# 16. Reactor 与虚拟线程在 Spring Boot 3.2+ 的实际差异,阻塞 JDBC 调用如何在 reactive 应用中定位? A 阻塞 JDBC 在 reactive 中安全 B 阻塞 JDBC 会阻塞事件循环线程,应通过线程分析/BlockHound 定位并隔离或改用 R2DBC ✓ 正确答案 C 阻塞调用无影响 D 无法定位阻塞调用
# 17. 虚拟线程与 WebFlux 选型错误的回滚成本如何评估? A 两者回滚成本相同 B 虚拟线程同步范式回滚成本低,WebFlux 响应式范式回滚成本高,选型应谨慎 ✓ 正确答案 C WebFlux 回滚成本最低 D 回滚成本与范式无关
# 18. 虚拟线程下数据库连接池(HikariCP)的瓶颈如何显现?为什么"百万虚拟线程"可能只有 50 个数据库连接可用? A 虚拟线程大量并发但数据库连接池有限,实际 DB 并发受连接池大小限制 ✓ 正确答案 B 虚拟线程可无限扩展数据库并发 C 连接池无上限 D 虚拟线程直接访问数据库
# 19. Structured Concurrency + Scoped Values 与 Reactor Context 在上下文传播上的对比,哪个更适合复杂业务链路? A ScopedValues 适合响应式 B 两者等价 C ScopedValues 适合同步/虚拟线程结构化并发,Reactor Context 适合响应式链,按并发模型选择 ✓ 正确答案 D Reactor Context 适合同步
# 20. Kotlin 协程与 Java 虚拟线程的互操作,suspend 函数如何在虚拟线程上运行,kotlinx-coroutines-reactor 的桥接模式如何? A 协程与 Reactor 无法互操作 B suspend 可配置在虚拟线程运行,kotlinx-coroutines-reactor 桥接协程与 Reactor 类型 ✓ 正确答案 C suspend 只能在平台线程运行 D 桥接只能单向
# 21. 响应式编程在流式处理(无限流、窗口聚合、背压)场景下仍不可替代的原因是什么?虚拟线程能否模拟这些语义? A 虚拟线程能模拟背压 B 无限流、窗口聚合、背压是响应式流式原语,虚拟线程并发模型无法模拟 ✓ 正确答案 C 响应式与流式无关 D 虚拟线程可做窗口聚合
# 22. Flux.cache 与 Flux.replay 在热点数据缓存中的应用与内存边界 A replay 只缓存一个元素 B cache 不占用内存 C cache 缓存结果供多订阅共享,但无限流/大数据量会耗尽内存,需用 size 限制 ✓ 正确答案 D 内存边界无需考虑
# 23. WebClient 的连接超时、响应超时与重试(retryWhen)配置及与重试幂等的配合 A 连接/响应超时 + retryWhen 重试,重试需配合幂等并控制退避 ✓ 正确答案 B 重试无需幂等 C 超时无法配置 D 重试无限次数
# 24. WebClient 的 exchangeToMono 与 retrieve 在响应体释放和错误处理上的差异,未消费响应体会导致什么连接泄漏 A 两者都自动释放 B retrieve 自动处理响应体,exchangeToMono 更底层但需手动消费 body,否则连接泄漏 ✓ 正确答案 C 未消费响应体无影响 D exchangeToMono 自动释放连接
# 25. 响应式链路中异常如何沿 onError 传播,onErrorResume/onErrorReturn/doFinally 在资源清理与降级中的分工 A onErrorResume/onErrorReturn 做降级,doFinally 保证资源清理,分工明确 ✓ 正确答案 B doFinally 做降级 C onErrorReturn 做清理 D 错误无法降级
# 26. 虚拟线程池下 ScheduledExecutorService 的兼容性边界在哪? A 定时调度需固定线程池语义,虚拟线程池按任务创建,建议用固定调度器而非虚拟线程池 ✓ 正确答案 B 虚拟线程池适合定时调度 C 两者语义相同 D 定时任务必须用虚拟线程
# 27. 在 JDK 21+ 异步 HTTP 客户端(java.net.http.HttpClient)上虚拟线程的弹性优势? A 必须用异步 sendAsync B 虚拟线程下同步 send 阻塞时挂起,无需异步回调即可高并发,编程更简单 ✓ 正确答案 C 同步 send 会占满平台线程 D 虚拟线程无弹性优势
# 28. 团队技术选型决策框架,什么团队规模/业务特征/技术债水平下选 Reactive,什么条件下选虚拟线程? A 所有团队都选 Reactive B 只按团队规模选 C 按团队技能、业务特征(流式/背压 vs 常规)、技术债综合评估,虚拟线程默认、Reactive 用于明确需求 ✓ 正确答案 D 技术债无关
# 29. StepVerifier 的虚拟时间(withVirtualTime)如何测试定时操作与背压行为 A 虚拟时间只能测响应 B 虚拟时间要真实等待 C 无法测试背压 D withVirtualTime 用虚拟时钟快进定时操作,thenRequest 控制请求验证背压 ✓ 正确答案