并发设计模式与线程安全实践

共 99 题
#

1. 双重检查锁定(Double-Checked Locking)在 Java 5+ 的 volatile 正确实现,与静态内部类懒加载的取舍

A 饿汉
B
C 静态内部类(Holder) ✓ 正确答案
D DCL
#

2. 读写锁(ReadWriteLock)在读多写少场景下的锁降级,与乐观锁在校验上的差异

A 读写锁
B 锁降级
C
D 乐观锁 ✓ 正确答案
#

3. Copy-on-Write 模式在配置快照与路由表更新中的应用,与读锁方案的取舍

A 写频繁
B 数据大
C
D 读多写少、更新低频 ✓ 正确答案
#

4. Guarded Suspension 模式的条件队列实现,为什么等待必须放在 while 循环中

A
B 语法
C 性能
D 防虚假唤醒与条件被抢先改变 ✓ 正确答案
#

5. Future 模式的轮询与回调,FutureTask 状态机在任务编排中的边界

A
B 回调
C 单任务完成/取消管理 ✓ 正确答案
D 复杂编排
#

6. 线程封闭(Thread Confinement)的三种形式与逃逸风险

A 全局
B 共享
C
D 栈封闭 + ThreadLocal ✓ 正确答案
#

7. 不可变对象(Immutable Object)的三个线程安全条件与构建策略

A
B 加锁
C volatile
D 字段 final + 状态不可变 + 安全发布 ✓ 正确答案
#

8. 单例模式在多线程环境下的安全发布,饿汉/懒汉/DCL/枚举的并发语义

A
B 懒汉
C 枚举 ✓ 正确答案
D DCL 无 volatile
#

9. 生产者-消费者模式中队列的选择,有界队列的背压与无界队列的 OOM 风险

A 任务堆积导致 OOM ✓ 正确答案
B 更快
C 背压
D
#

10. Actor 模型(Akka)与共享内存并发在 Java 后端的取舍

A 共享状态
B 加锁
C
D 消息传递、无共享状态 ✓ 正确答案
#

11. Disruptor 环形缓冲区相对阻塞队列的性能优势来源(缓存行填充/无锁 CAS/预分配)

A 缓存行填充 + 无锁 CAS + 预分配 ✓ 正确答案
B
C 动态分配
D 有锁
#

12. Future 模式的阻塞 get、轮询 isDone 与 CompletableFuture 回调三种消费方式的取舍

A 阻塞 get
B CompletableFuture 回调 ✓ 正确答案
C 轮询
D
#

13. Guarded Suspension 模式与 Balking 模式在并发状态机中的工程取舍

A
B Balking ✓ 正确答案
C Guarded Suspension
D 两者
#

14. 阻塞队列与信号量组合的限流模式,任务提交前的准入控制

A 执行
B 准入控制 ✓ 正确答案
C
D 入队
#

15. 线程安全发布的 happens-before 保证,final 字段与安全发布

A 加锁
B
C volatile
D 无锁的安全发布(构造冻结) ✓ 正确答案
#

16. 锁分段(Striped Lock)在热点资源上的应用,与单一全局锁的对比

A 更快
B 简单
C
D 并发度高、减少竞争 ✓ 正确答案
#

17. Worker Thread 模式与线程池的任务队列选择(有界/无界/同步队列)对背压的影响

A 有界队列
B 同步队列
C 无界队列 ✓ 正确答案
D
#

18. 并发状态机的实现,状态字段的原子更新与版本号校验

A 普通赋值
B 原子 CAS + 版本号校验 ✓ 正确答案
C
D 静态
#

19. 不可变对象(Immutable Object)实现线程安全的三个条件与 final 字段的内存语义配合

A 加锁
B
C 构造后读到最终值 ✓ 正确答案
D 可变
#

20. ConcurrentHashMap 的分段思想在自定义缓存分片中的应用

A 单段
B 全局锁
C 哈希分散到分片 + 分片锁 ✓ 正确答案
D
#

21. 不可变集合(List.of/Map.of)与防御性拷贝在安全发布中的协作

A
B 加锁
C 防止外部修改内部数据 ✓ 正确答案
D 加速
#

22. 安全发布的五种方式(静态初始化/volatile/AtomicReference/final/锁保护)与 this 引用逃逸防范

A
B 省内存
C 更快
D 其他线程看到未构造完整的对象 ✓ 正确答案
#

23. 并发设计模式中的 Check-Then-Act 竞态与原子化替代

A 原子操作(putIfAbsent/CAS/锁) ✓ 正确答案
B
C 随机
D 分开检查操作
#

24. 工作窃取(Work-Stealing)与任务拆分粒度的关系

A 更均衡
B
C 窃取频繁,调度开销大 ✓ 正确答案
D 更快
#

25. 线程封闭的三种形式(栈封闭/ThreadLocal/对象封装)的适用场景与内存泄漏代价

A
B 对象
C
D 线程池复用 + 弱引用 key/value 强引用 ✓ 正确答案
#

26. 读写锁的公平与非公平选择在吞吐与饥饿间的权衡

A 公平读写锁 ✓ 正确答案
B 非公平锁
C
D 任意
#

27. Balking 模式与状态检查,对象状态未就绪时直接返回的适用场景

A 阻塞
B
C 状态未就绪可跳过(直接返回) ✓ 正确答案
D 必须等待
#

28. 锁粗化与锁消除的边界,JIT 何时能优化同步代码,业务侧应如何写锁

A
B ReentrantLock
C synchronized ✓ 正确答案
D 两者
#

29. 线程安全的延迟初始化,holder class idiom 与 DCL 的对比

A
B holder class idiom ✓ 正确答案
C DCL
D 饿汉
#

30. 生产者-消费者中条件变量(Condition)的精确唤醒与信号丢失

A await 用 while 循环 + 先改条件再 signal ✓ 正确答案
B
C 忽略
D 随机
#

31. 并发集合的弱一致性迭代器在快照语义上的取舍

A
B 不保证反映所有修改 ✓ 正确答案
C 抛异常
D 严格快照
#

32. 责任链模式在并发任务预处理/后处理中的应用

A 阻塞
B
C 预处理/后处理链式组织 ✓ 正确答案
D 加锁
#

33. 异步任务的编排模式,回调、Future 与事件驱动三者的边界

A Future
B 事件驱动(反应式) ✓ 正确答案
C 回调
D
#

34. 多线程下单例服务的状态管理,无状态服务与不可变配置

A 可变状态
B 加锁
C
D 无状态 + 不可变配置 ✓ 正确答案
#

35. 并发配置热更新,Copy-on-Write 配置对象与原子引用

A 阻塞
B 加锁
C 不可变配置 + 原子引用 CAS 替换 ✓ 正确答案
D
#

36. 双重检查锁定在资源池初始化中的应用与陷阱

A 加锁
B volatile 防半初始化 + 失败处理 ✓ 正确答案
C
D 普通字段
#

37. 测试中的并发控制,如何用并发工具类验证线程安全

A jcstress ✓ 正确答案
B 静态
C 单测
D
#

38. 线程池任务的装饰器模式,包装 Runnable 实现超时、埋点与清理

A
B 业务
C 超时、埋点、清理、异常 ✓ 正确答案
D 加锁
#

39. 观察者模式与事件总线的线程模型,同步/异步/事务事件的取舍

A 线程池异步执行 ✓ 正确答案
B
C 阻塞
D 发布线程
#

40. 并发任务的异常聚合模式,CompletableFuture 与结构化并发的异常传播

A Future
B CompletableFuture
C StructuredTaskScope ✓ 正确答案
D
#

41. 懒加载的并发安全,双重检查与静态内部类在单例初始化上的对比

A
B 饿汉
C DCL
D 静态内部类 ✓ 正确答案
#

42. 状态机模式与并发控制,状态转移的原子性保证

A 普通赋值
B
C CAS 原子转移 ✓ 正确答案
D 静态
#

43. 不可变值对象在线程间传递的安全发布方式

A 加锁
B final 字段冻结 ✓ 正确答案
C 可变
D
#

44. 请求级上下文(Request Scope)与线程安全,为什么共享可变请求对象危险

A 多线程并发修改导致竞态 ✓ 正确答案
B
C 省内存
D 更快
#

45. 锁获取顺序与死锁预防,全序锁 vs 部分序锁

A
B 全序锁(统一顺序) ✓ 正确答案
C 随机顺序
D 任意
#

46. 线程池任务路由,按任务类型选择专用线程池的隔离模式

A 隔离故障(一种任务不拖累其他) ✓ 正确答案
B 资源利用高
C
D 更快
#

47. 线程安全的消息转换器设计,无状态处理器与线程局部缓冲

A
B 无状态 + 线程局部缓冲 ✓ 正确答案
C 加锁
D 可变状态
#

48. 会话级状态的线程安全,Session 与线程池共享的冲突

A 省内存
B 多线程并发修改会话状态 ✓ 正确答案
C
D 更快
#

49. 模板方法模式在并发任务骨架中的应用,同步、加锁与超时的固定顺序

A 统一加锁/执行/释放的固定顺序 ✓ 正确答案
B 阻塞
C
D 加锁
#

50. 策略模式在并发限流/重试策略选择中的应用

A
B 加锁
C 可替换的限流/重试策略 ✓ 正确答案
D 阻塞
#

51. 线程安全的类型转换器,不可变转换器与缓存

A 可变状态
B
C 加锁
D 不可变(无状态)+ 并发缓存 ✓ 正确答案
#

52. 拦截器模式在并发任务生命周期钩子(before/after)中的应用

A 阻塞
B before/after 钩子注入横切逻辑 ✓ 正确答案
C
D 加锁
#

53. 参数解析与线程安全,局部变量优先于共享可变状态

A
B 局部变量(栈封闭) ✓ 正确答案
C 共享可变状态
D 静态
#

54. 代理模式在并发控制中的应用,同步代理与远程代理

A 包装对象加锁实现线程安全 ✓ 正确答案
B 分布式
C
D 加速
#

55. 事务与线程绑定,ThreadLocal 事务上下文在多线程下的边界

A 不自动,需显式或新事务 ✓ 正确答案
B
C 总是
D 自动
#

56. 并发工具的横切织入,如何统一为任务添加重试与超时

A 装饰器/AOP 横切织入 ✓ 正确答案
B 业务内写
C 阻塞
D
#

57. 资源提供者模式,对象工厂的线程安全初始化

A 单例 + 并发安全初始化 + 资源池化 ✓ 正确答案
B 阻塞
C
D 加锁
#

58. 共享资源的并发访问,资源池化与读写隔离

A 全局锁
B
C 读写隔离(读无锁/写复制) ✓ 正确答案
D 阻塞
#

59. 同步与异步客户端在并发模型上的差异,每请求一线程 vs 事件循环

A 阻塞
B
C 少量线程处理大量请求(非阻塞) ✓ 正确答案
D 每请求一线程
#

60. 模式匹配与并发缓存,路由表的并发读写一致性

A 阻塞
B 普通 HashMap
C
D 不可变快照/并发缓存 ✓ 正确答案
#

61. 错误对象在并发异常处理中的线程安全,异常栈与错误码的不可变性

A
B 加锁
C 可变
D 不可变(只读字段) ✓ 正确答案
#

62. 依赖升级对并发语义的影响,JDK 与框架版本变更中的线程模型变化

A
B 线程模型/并发语义变化 ✓ 正确答案
C 更快
D 更省
#

63. 国际化资源的多线程安全,不可变资源包与缓存

A 不可变资源包 + 并发缓存 ✓ 正确答案
B
C 加锁
D 可变
#

64. Spring 容器的事件机制(ApplicationEvent/ApplicationListener)

A 虚拟线程
B 异步
C 同步(发布线程调用监听器) ✓ 正确答案
D
#

65. 配置属性的并发读取,原子快照与最终一致性的边界

A 不可变配置 + 原子引用 ✓ 正确答案
B 最终一致
C 分字段更新
D
#

66. 推送模型的线程安全,长连接与写线程的并发控制

A
B 写串行化(锁/队列) ✓ 正确答案
C 加线程
D 阻塞
#

67. Thread-Per-Message 模式在虚拟线程时代的简化与 Executor 框架的边界

A 免池化、阻塞卸载、高并发 ✓ 正确答案
B
C 串行
D 池化
#

68. 事务传播与线程边界,REQUIRES_NEW 在并发调用下的连接分配

A 串行
B 共享连接
C 每线程独立新事务、独立连接 ✓ 正确答案
D
#

69. Two-Phase Termination 模式的 interrupt 协作与 join 等待在优雅停机中的实现

A
B interrupt 通知 ✓ 正确答案
C join
D 杀线程
#

70. 配置文件的并发加载与热更新,不可变配置快照模式

A 不可变快照 + 原子引用 ✓ 正确答案
B 可变配置
C
D 阻塞
#

71. SPI 加载的并发安全,ServiceLoader 与缓存

A 懒加载 + volatile 缓存 ✓ 正确答案
B 加锁
C 阻塞
D
#

72. 热点路径的并发优化,减少锁竞争与伪共享

A 阻塞
B 加锁
C
D 缓存行填充 ✓ 正确答案
#

73. 健康检查的并发执行,超时与并行探测

A 每项设超时、并行执行 ✓ 正确答案
B 无限等待
C 串行
D
#

74. 并发代码中的不可变数据优化,final 与有效不可变

A 可修改
B 加锁
C
D 构造后不再修改(安全发布) ✓ 正确答案
#

75. 配置优先级与并发覆盖,多数据源配置的原子切换

A 阻塞
B
C 不可变快照 + 原子切换 ✓ 正确答案
D 分字段写
#

76. 多数据源与线程绑定,路由数据源在并发下的上下文管理

A 静态
B ThreadLocal(线程绑定) ✓ 正确答案
C 全局
D
#

77. 流式写出的线程安全,异步写出与连接关闭的竞争

A 加线程
B 阻塞
C
D 锁/状态检查串行化 + 捕获写异常 ✓ 正确答案
#

78. 嵌入式容器的线程模型,容器线程池与业务并发的关系

A 容器线程
B 独立业务线程池 ✓ 正确答案
C
D 阻塞
#

79. JFR 采样与并发诊断,锁竞争事件的采集与分析

A
B jdk.GC
C jdk.Class
D jdk.JavaMonitorEnter ✓ 正确答案
#

80. 锁优化失效的运行时表现,偏向锁撤销与锁竞争

A 更省
B
C 更快
D 锁竞争升级重量级,线程阻塞 ✓ 正确答案
#

81. 循环并行化,数据竞争与同步开销的权衡

A
B 迭代间数据独立(无竞争) ✓ 正确答案
C 共享数据
D 加锁
#

82. 参数校验的线程安全,校验器无状态与共享校验上下文

A 可变状态
B 无状态(只处理入参) ✓ 正确答案
C
D 加锁
#

83. 依赖注入与线程安全,构造器注入保证不可变依赖

A 构造器注入 ✓ 正确答案
B
C 字段注入
D setter 注入
#

84. 生产者-消费者模式四种实现(BlockingQueue/wait-notify/Condition/Disruptor)的性能对比与选型

A Condition
B Disruptor ✓ 正确答案
C BlockingQueue
D wait-notify
#

85. 虚拟线程的开启方式(spring.threads.virtual.enabled)及其与 Tomcat/Jetty 线程模型的边界

A 注解
B 默认
C spring.threads.virtual.enabled=true ✓ 正确答案
D
#

86. 环绕执行的并发模板,加锁、执行与释放的固定模式

A 锁一定释放(try/finally) ✓ 正确答案
B 忘释放
C
D 加速
#

87. 配置校验的并发执行,启动校验与运行期校验的边界

A 阻塞
B 单次
C 并发安全 + 失败回滚 ✓ 正确答案
D
#

88. 静态资源的并发访问,不变文件与缓存一致性

A 版本号/ETag ✓ 正确答案
B
C 阻塞
D 加锁
#

89. 多语言互操作与并发,跨语言调用的线程模型

A 更快
B 钉住载体线程 ✓ 正确答案
C
D 更省
#

90. 安全随机数的并发使用,SecureRandom 的线程安全

A
B 阻塞
C 加锁
D 线程安全但竞争,可用 ThreadLocal 分散 ✓ 正确答案
#

91. 模式匹配与并发,模式变量在锁内外的生命周期

A 可用
B
C 共享
D 不可用(作用域结束) ✓ 正确答案
#

92. 方法耗时采集与并发,采样对线程执行的影响

A 阻塞
B 采样(JFR) ✓ 正确答案
C 全量统计
D
#

93. 证书加载的并发安全,PKI 缓存与多线程初始化

A 加锁
B 阻塞
C
D 并发缓存 + 懒加载 ✓ 正确答案
#

94. CPU 时间剖析与并发,区分等待与执行的采样方法

A
B 阻塞
C 加锁
D getThreadCpuTime + 线程状态采样 ✓ 正确答案
#

95. JFR 事件与线程 dump 在死锁诊断中的配合

A 成因
B
C 死锁结构(循环等待链) ✓ 正确答案
D 时间线
#

96. 并发基准的陷阱,预热不足与锁竞争导致的偏差

A 忽略
B 无预热
C 充分预热 + 控制竞争 ✓ 正确答案
D 单线程
#

97. 并发微基准测试的规范,隔离线程数与状态作用域

A 静态
B 阻塞
C @Threads ✓ 正确答案
D
#

98. 火焰图定位并发瓶颈,锁等待与上下文切换的识别

A CPU 火焰图
B 静态
C
D off-CPU 火焰图 ✓ 正确答案
#

99. 分配剖析与并发,TLAB 竞争在并发应用中的表现

A
B 加锁
C 阻塞
D 每线程本地分配缓冲,减少竞争 ✓ 正确答案