Java面试题更新 2026-08-05

请解释 Java 并发编程中的原子性、可见性和有序性,并说明它们之间的关系以及 Java 如何提供支持。

技术原理Java

考察说明

考查对 Java 内存模型核心概念的掌握,以及能否区分三者的含义和实现机制。

回答思路

  1. 【回答框架 1】原子性指一个操作或多个操作要么全部执行且不被中断,要么都不执行。Java 中通过 synchronized、Lock 以及 java.util.concurrent.atomic 包中的原子类来保证原子性。注意,volatile 不能保证复合操作的原子性。
  2. 【回答框架 2】可见性指当一个线程修改共享变量后,其他线程能立即看到这个修改。Java 通过 volatile、synchronized 和 final 关键字保证可见性,其底层依赖内存屏障和缓存一致性协议(如 MESI)。
  3. 【回答框架 3】有序性指程序执行的顺序按照代码的先后顺序执行。Java 中通过 volatile、synchronized 和 Lock 来禁止指令重排序,保证有序性。happens-before 规则是判断数据竞争是否安全的重要依据。
  4. 【回答框架 4】三者关系密切:可见性是有序性的基础,原子性保证操作的不可分割,而有序性防止重排序导致的意外结果。Java 内存模型(JMM)通过这三者定义了线程与内存之间的抽象关系。
  5. 【关键点 1】原子性:synchronized、Lock、Atomic 类保证复合操作原子性。
  6. 【关键点 2】可见性:volatile 保证变量修改对其他线程立即可见。
  7. 【关键点 3】有序性:volatile 和锁禁止指令重排序,保证程序执行顺序。
  8. 【关键点 4】happens-before 规则是 JMM 提供的跨线程内存可见性保证。
  9. 【易错点 1】误将 volatile 当作原子操作的保证,volatile 只保证可见性和有序性,不保证复合操作的原子性。
  10. 【易错点 2】忽略指令重排序在单线程下不影响结果,但在多线程下可能引发安全问题。
  11. 【易错点 3】混淆内存屏障与锁的实现机制,synchronized 通过监视器锁实现互斥,volatile 通过内存屏障实现可见性。