精通 volatile、synchronized、Atomic 原子类适用场景、可见性与原子性问题;
一、基础概念
1、什么是可见性、原子性、有序性?
答案
- 可见性:一个线程改了变量,其他线程能立刻看到最新值。
- 原子性 :一个操作不可拆分,要么全部执行完,要么不执行。
- 有序性:防止 CPU 指令重排,代码按编写顺序执行。
2、volatile 能保证什么?不能保证什么?
答案
✅ 保证:可见性、有序性(禁止指令重排)
❌ 不保证:原子性 适合做状态标记,不适合做计数、i++ 这种复合操作。
二、volatile 相关面试题
3、volatile 原理
答案
底层内存屏障 + CPU 缓存一致性协议;
强制修改立刻刷回主内存 ,其他线程强制从主内存读取,不走工作缓存,保证可见性;同时禁止指令重排。
4、volatile 适用场景
答案
- 一写多读:一个线程修改,多个线程只读取。
- 布尔状态位、开关标记、全局控制标识。
- 双重校验锁 DCL 单例(防止指令重排)。
5、为什么 volatile 不能保证 i++?
答案
i++ 是三步复合操作:取值 → 加 1 → 赋值
volatile 只能保证每次拿到最新值,但三步不能打包原子执行,多线程会覆盖丢失,结果不准。
三、synchronized 相关
6、synchronized 作用
答案
同时保证:可见性 + 原子性 + 有序性独占锁,同一时间只能一个线程进入,既能锁方法也能锁代码块。
7、synchronized 锁的是什么?
答案
- 修饰普通方法:锁 当前对象 this
- 修饰静态方法:锁 类的 Class 对象
- 修饰代码块:锁 括号里的任意对象
8、synchronized 和 volatile 区别
答案
- volatile 只做标记 ,不阻塞;synchronized 是排他锁,会阻塞。
- volatile 无原子性;synchronized 有原子性。
- volatile 轻量、开销小;synchronized 重量级、开销大。
四、Atomic 原子类
9、Atomic 原子类是什么?常用有哪些?
答案
基于 CAS 无锁 实现线程安全;
常用:AtomicInteger、AtomicBoolean、AtomicLong、AtomicReference
10、CAS 原理
答案
比较并交换:拿内存旧值 和 当前预期值 对比;
相等说明没被别人修改,就更新新值;
不相等就重试,直到成功。
11、Atomic 为什么比 synchronized 快?
答案
Atomic 是 CAS 无锁自旋,不阻塞线程;
synchronized 是重量级互斥锁,会阻塞、挂起线程,开销更大。
12、Atomic 适用场景
答案
多线程高频计数、自增自减、标记位;
不想用重量级锁,追求高并发高性能场景。
五、三者选型对比(面试必背)
13、怎么选?
答案
- 只是状态标记、一写多读 → 用 volatile
- 简单计数、i++ 并发自增 → 用 Atomic 原子类
- 复合业务逻辑、多行代码要整体互斥 → 用 synchronized
六、极简一句话总结
1、volatile 保证可见性和有序性、不保证原子性,适合状态标识;
2、synchronized 全能保证可见性原子性有序性,悲观互斥锁;
3、Atomic 基于 CAS 无锁自旋,高性能解决简单并发计数,比加锁更轻量。