组合、代理与事件模式

共 22 题
#

1. 装饰器模式的组合顺序中多个装饰器叠加时执行顺序如何决定(后加的在外层先执行),与责任链模式在'顺序敏感'上的差异?

A 装饰器与责任链的执行顺序完全相同
B 责任链中所有处理器一定全部执行
C 装饰器嵌套包裹、后加的外层先执行且全部生效,责任链链式传递可中断 ✓ 正确答案
D 装饰器可以中断处理流程
#

2. 组合模式的统一接口中如何让叶子与容器实现同一接口以支持递归处理,遍历统计与访问者模式(Visitor)在职责上的分工?

A 组合模式负责所有操作逻辑,Visitor 只负责结构
B 组合用统一接口递归遍历结构,Visitor 在遍历时扩展操作而不修改节点类 ✓ 正确答案
C 组合模式不需要递归遍历
D Visitor 需要修改每个节点类才能添加操作
#

3. 组合模式在文件系统/UI 组件树中的应用中如何统一文件与目录接口,递归计算大小/统计数量,与迭代器模式的配合?

A 文件与目录必须使用不同接口
B 文件与目录统一接口,目录递归聚合子节点大小,迭代器提供统一遍历 ✓ 正确答案
C 组合模式与迭代器模式无关
D 目录不能递归统计子节点大小
#

4. 同步代理(Synchronization Proxy)的实现中如何用代理在方法调用前后统一加锁实现线程安全,与直接同步方法在可测试性上的差异?

A 同步代理把锁逻辑写在业务方法内部
B 代理在方法调用前后统一加锁,把线程安全与业务逻辑分离,业务对象更易测试与复用 ✓ 正确答案
C 同步代理无法保证线程安全
D 同步代理与直接同步方法在可测试性上完全相同
#

5. Thread Pool 线程池模式中核心线程数、最大线程数、任务队列选型(有界/无界/同步移交)、拒绝策略(Abort/CallerRuns/Discard)的工程取舍

A 无界队列永远不会产生问题
B 同步移交会缓存大量任务
C 有界队列+拒绝策略提供背压防溢出,无界队列可能内存溢出,CallerRuns 用调用者线程执行提供背压 ✓ 正确答案
D 拒绝策略与队列选型无关
#

6. 享元模式的内在状态(intrinsic,可共享)与外在状态(extrinsic,由客户端传入)划分,以及多线程下享元池的线程安全策略

A 外在状态存于享元对象中,多个上下文共享
B 内在状态不变可共享、外在状态随上下文由客户端传入,享元对象不可变以支持多线程安全共享 ✓ 正确答案
C 内在状态可随上下文变化
D 享元对象可变也能安全共享
#

7. 享元模式的适用边界中什么场景下共享反而得不偿失(对象创建便宜、状态易变、共享状态需同步),如何判断是否值得引入?

A 对象创建便宜、状态易变或共享需同步时共享得不偿失,对象量大且内在状态稳定时才值得 ✓ 正确答案
B 对象创建便宜时享元收益最大
C 享元模式一定值得引入
D 状态易变时享元共享最容易
#

8. 装饰器(Decorator)与代理(Proxy)在结构相同(都持有组件引用)下的意图差异中装饰器增强功能,代理控制访问

A 装饰器增强功能(叠加职责),代理控制访问(拦截与权限),结构上都会持有组件引用 ✓ 正确答案
B 两者意图完全相同
C 代理一定不持有组件引用
D 装饰器用于控制访问,代理用于增强功能
#

9. CountDownLatch 与 CyclicBarrier 中一次性门闩 vs 可复用屏障的语义差异,分别在并行任务汇聚(join)场景如何使用?

A CountDownLatch 可以复用
B CountDownLatch 一次性等待计数归零,CyclicBarrier 可复用等待 N 个线程到达对齐 ✓ 正确答案
C CyclicBarrier 只能使用一次
D 两者语义完全相同
#

10. 生产者-消费者的队列选型中有界/无界队列在背压与丢弃策略上的差异,如何用信号量或容量控制生产速率?

A 无界队列天然提供背压
B 有界队列永远不阻塞生产者
C 信号量与队列背压无关
D 有界队列满时阻塞或拒绝提供背压,无界队列可能内存溢出,信号量可限制在途任务量 ✓ 正确答案
#

11. 智能引用(Smart Reference)与引用计数中 shared_ptr 如何自动管理资源释放,循环引用与原子计数开销如何解决?

A 引用计数归零自动释放,循环引用用 weak_ptr 打破,原子计数需减少拷贝以降低开销 ✓ 正确答案
B 循环引用由 shared_ptr 自动解决
C shared_ptr 永远不泄漏
D 引用计数是纯非原子的,无开销
#

12. Thread-Specific Storage 线程局部存储的适用场景与内存泄漏风险中线程池中 ThreadLocal 未 remove 导致对象无法回收

A ThreadLocal 的 value 会自动随任务结束回收
B 线程池线程会频繁销毁,无需清理 ThreadLocal
C ThreadLocal 与线程池无关,不会泄漏
D 线程池复用线程,未 remove 的 ThreadLocal value 留在线程中无法回收,导致内存泄漏 ✓ 正确答案
#

13. 线程协作模式与并发原语(锁、信号量、条件变量)的边界差异?

A 原语与协作模式毫无关系
B 原语(锁/信号量/条件变量)是底层机制,协作模式是建立在其上的针对性套路 ✓ 正确答案
C 协作模式不需要任何并发原语
D 条件变量属于上层协作模式而非原语
#

14. 生产者消费者、读写锁等线程协作模式在生产中的典型应用?

A 生产者-消费者用于任务队列解耦生产消费,读写锁用于读多写少的共享数据并发读 ✓ 正确答案
B 读写锁适合写多读少的场景
C 生产者-消费者模式只能用于日志
D 线程协作模式不适用于生产系统
#

15. 线程协作有哪些常见误区(死锁、忙等、虚假唤醒)?

A 忙等能高效利用 CPU
B 死锁用固定加锁顺序/超时避免,忙等用条件变量阻塞等待,虚假唤醒用 while 循环重查条件 ✓ 正确答案
C 虚假唤醒无需处理
D if 条件等待能正确防止虚假唤醒
#

16. 线程协作的核心概念中等待通知、顺序保证与公平性?

A 等待通知不需要条件变量
B 顺序保证与可见性无关
C 等待通知实现条件驱动唤醒,顺序保证确保操作可见性,公平性决定资源分配次序 ✓ 正确答案
D 公平性只影响性能不影响正确性
#

17. Go channel 的同步/带缓冲语义中如何用 channel 实现 goroutine 间通信与同步,无缓冲 channel 的收发握手如何阻塞?

A 无缓冲 channel 收发必须配对、阻塞握手实现同步,带缓冲 channel 提供异步队列 ✓ 正确答案
B 带缓冲 channel 发送总会阻塞
C channel 只能通信不能同步
D 无缓冲 channel 发送永不阻塞
#

18. Proactor 与 Reactor 的工程取舍中为什么 Windows IOCP 采用完成回调(Proactor)而 Netty 是事件分发(Reactor),两者的线程模型差异?

A Reactor 是异步 IO,Proactor 是同步 IO
B Reactor 检测就绪后由事件循环做 IO(同步),Proactor 由内核完成 IO 后回调(异步),IOCP 契合 Proactor、epoll 契合 Reactor ✓ 正确答案
C IOCP 最适合 Reactor 模式
D Reactor 与 Proactor 完全等价
#

19. SynchronousQueue 的直接移交中它没有容量,生产者与消费者如何配对握手,在 newCachedThreadPool 中的作用?

A SynchronousQueue 会缓存大量任务
B SynchronousQueue 的 put 永不阻塞
C newCachedThreadPool 用有界队列缓存任务
D 无容量,put 与 take 配对握手直接移交,newCachedThreadPool 用它实现任务即来即走、按需建线程 ✓ 正确答案
#

20. 事件循环的阻塞风险中 CPU 密集任务必须移出事件循环(如 Node worker_threads),阻塞事件循环如何延迟所有回调?

A CPU 密集任务可以放心在事件循环中执行
B 阻塞事件循环只影响当前任务
C 事件循环是多线程的,不会阻塞
D 单线程事件循环中 CPU 密集任务会阻塞所有回调,必须移出到 worker 线程 ✓ 正确答案
#

21. 共享内存并发重构到 Actor 的步骤中如何识别共享状态、定义消息协议与所有权,重构中消息风暴与调试难度如何权衡?

A 步骤是识别共享状态、封装进 Actor、定义消息协议,但要权衡消息风暴与调试难度 ✓ 正确答案
B Actor 之间仍共享可变状态
C 消息需要共享可变引用
D Actor 重构无需定义消息协议
#

22. 管道(Pipeline)与责任链的差异中数据流式处理 vs 请求逐级处理,流水线各阶段如何并行执行与背压控制?

A 管道与责任链完全相同
B 管道是数据流式全阶段处理、可并行,责任链是请求逐级传递、可中断 ✓ 正确答案
C 责任链强调数据流的并行处理
D 管道各阶段无法并行