6、精通 volatile、synchronized、Atomic 原子类适用场景、可见性与原子性问题;

23 阅读3分钟

精通 volatile、synchronized、Atomic 原子类适用场景、可见性与原子性问题;

一、基础概念

1、什么是可见性、原子性、有序性?

答案

  • 可见性:一个线程改了变量,其他线程能立刻看到最新值。
  • 原子性:一个操作不可拆分,要么全部执行完,要么不执行。
  • 有序性:防止 CPU 指令重排,代码按编写顺序执行。

2、volatile 能保证什么?不能保证什么?

答案

✅ 保证:可见性、有序性(禁止指令重排)

❌ 不保证:原子性适合做状态标记,不适合做计数、i++ 这种复合操作。

二、volatile 相关面试题

3、volatile 原理

答案

底层内存屏障 + CPU 缓存一致性协议;

强制修改立刻刷回主内存,其他线程强制从主内存读取,不走工作缓存,保证可见性;同时禁止指令重排。

4、volatile 适用场景

答案

  1. 一写多读:一个线程修改,多个线程只读取。
  2. 布尔状态位、开关标记、全局控制标识。
  3. 双重校验锁 DCL 单例(防止指令重排)。

5、为什么 volatile 不能保证 i++?

答案

i++ 是三步复合操作:取值 → 加 1 → 赋值

volatile 只能保证每次拿到最新值,但三步不能打包原子执行,多线程会覆盖丢失,结果不准。

三、synchronized 相关

6、synchronized 作用

答案

同时保证:可见性 + 原子性 + 有序性独占锁,同一时间只能一个线程进入,既能锁方法也能锁代码块。

7、synchronized 锁的是什么?

答案

  • 修饰普通方法:锁 当前对象 this
  • 修饰静态方法:锁 类的 Class 对象
  • 修饰代码块:锁 括号里的任意对象

8、synchronized 和 volatile 区别

答案

  1. volatile 只做标记,不阻塞;synchronized 是排他锁,会阻塞
  2. volatile 无原子性;synchronized 有原子性。
  3. volatile 轻量、开销小;synchronized 重量级、开销大。

四、Atomic 原子类

9、Atomic 原子类是什么?常用有哪些?

答案

基于 CAS 无锁 实现线程安全;

常用:AtomicInteger、AtomicBoolean、AtomicLong、AtomicReference

10、CAS 原理

答案

比较并交换:拿内存旧值当前预期值 对比;

相等说明没被别人修改,就更新新值

不相等就重试,直到成功。

11、Atomic 为什么比 synchronized 快?

答案

Atomic 是 CAS 无锁自旋,不阻塞线程;

synchronized 是重量级互斥锁,会阻塞、挂起线程,开销更大。

12、Atomic 适用场景

答案

多线程高频计数、自增自减、标记位

不想用重量级锁,追求高并发高性能场景。

五、三者选型对比(面试必背)

13、怎么选?

答案

  1. 只是状态标记、一写多读 → 用 volatile
  2. 简单计数、i++ 并发自增 → 用 Atomic 原子类
  3. 复合业务逻辑、多行代码要整体互斥 → 用 synchronized

六、极简一句话总结

1、volatile 保证可见性和有序性、不保证原子性,适合状态标识;

2、synchronized 全能保证可见性原子性有序性,悲观互斥锁;

3、Atomic 基于 CAS 无锁自旋,高性能解决简单并发计数,比加锁更轻量。