volatile 与 JMM 内存模型

共 19 题
#

1. JMM 1.0(JSR 133)内存模型的影响范围

A 弱化 volatile
B 修正 volatile 语义、引入 final 安全发布、确立 happens-before ✓ 正确答案
C 移除锁
D 与并发无关
#

2. JMM 与 CPU 缓存一致性(MESI)协议的关系

A 完全相同
B MESI 覆盖 JMM
C 无关
D JMM 是语言级抽象,MESI 是硬件缓存一致性协议,JMM 通过屏障映射到硬件 ✓ 正确答案
#

3. JMM 在 CPU 缓存一致性协议(MESI)下的抽象映射细节

A 写回主存 + 使其他缓存失效 + store barrier ✓ 正确答案
B 无操作
C 仅读
D 仅普通写
#

4. JMM 形式化(Java Memory Model Formalism)

A 类加载
B 内存布局
C 语法
D 哪些执行轨迹与读值合法,以及禁止 out-of-thin-air ✓ 正确答案
#

5. JMM(Java Memory Model)的 happens-before 规则在虚拟线程间的可见性保证如何

A 比平台线程弱
B 更强
C 虚拟线程无需同步
D 与平台线程完全一致 ✓ 正确答案
#

6. JMM(Java Memory Model)的核心概念与 happens-before 原则

A 任意线程写都可见
B 读先于写
C 随机序
D volatile 写 happens-before 后续对该 volatile 的读 ✓ 正确答案
#

7. double-checked locking 在 JDK 5+ 的正确实现与 volatile 关键作用

A 无作用
B 禁止构造与赋值间的重排,防止读到半初始化对象 ✓ 正确答案
C 加速
D 使对象可变
#

8. final 字段在 JMM 中的安全发布保证

A 必须加锁
B 只保证子类
C 无保证
D 构造完成后读取该字段必见最终值,构成安全发布 ✓ 正确答案
#

9. happens-before 与 synchronized 块边界的等价

A
B 方法名
C 线程数
D 释放锁 happens-before 后续获取同一锁 ✓ 正确答案
#

10. release 写入与 acquire 读取如何建立可见性链,和完整 volatile 读写相比允许哪些重排序

A 更少重排
B 相同
C 无重排
D 更多重排(无全序,只单向约束) ✓ 正确答案
#

11. volatile 关键字的语义(可见性、禁止重排序)

A 缓存一致性
B 可见性
C 复合操作的原子性 ✓ 正确答案
D 禁止重排
#

12. volatile 写操作的内存屏障(Memory Barrier)在 x86 与 ARM 架构下的成本差异

A 相同
B 无差异
C x86(强序)
D ARM(弱序,需更多显式屏障) ✓ 正确答案
#

13. volatile 数组与单个元素的可见性差异

A 数组元素
B 两者
C 数组引用,而非元素 ✓ 正确答案
D
#

14. 单例模式双重检查锁(DCL)的 volatile 必要性

A 更快
B 可能读到半初始化对象 ✓ 正确答案
C 更安全
D 正常
#

15. 成功 release 后对后继线程的可见性由哪些内存语义保证,自定义同步器最容易漏掉什么

A 用 volatile/原子更新 state 并正确唤醒后继 ✓ 正确答案
B 注释
C 方法名
D 线程数
#

16. 指令重排序(编译器、CPU、内存)的真实案例

A 仅 CPU
B 仅内存
C 仅编译器
D 编译器、CPU、内存系统多层 ✓ 正确答案
#

17. JDK 25 中 MemorySegment(外部内存 API)对堆外内存的可见性保证

A 自动可见
B 仅线程本地
C 永不可见
D 需同步或 VarHandle 内存序保证,与普通字段一致 ✓ 正确答案
#

18. Java 25 内存模型与 Vector API(JEP 508)的内存序

A 通过 MemorySegment + VarHandle 指定 ✓ 正确答案
B 自动最强
C 内置
D
#

19. Thread.yield() 与内存可见性

A 与 JMM 相同
B 提供
C 不提供,仅让出 CPU,需锁/volatile 保证可见性 ✓ 正确答案
D 部分提供