必看6

精通 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 无锁自旋,高性能解决简单并发计数,比加锁更轻量。

相关推荐
Starry-sky(jing)4 小时前
Vidda ADB 开启:R Pro 65 找不到开发者选项的处理与连接验收
android·adb·远程控制·电视·vidda
雨白5 小时前
从原理到实践:使用 Kotlin KSP 仿写 ButterKnifeLite
android·kotlin
疯华整猫6 小时前
把二十七个 init 从首帧前面搬走:用 Trae 把启动优化钉进 CI
android·性能优化·ai编程
传奇开心果6 小时前
【探秘 Jetpack Compose 框架深水区】 第8课:rememberSaveable 的边界在哪里?——Bundle、Saver 与什么值得跨进程存活
android·kotlin
Frankie_stand8 小时前
测试自动化实战指南:从脚本化、自动判据到 CI 集成的完整落地路径
android·ci/cd·自动化
恋猫de小郭9 小时前
Flutter 大小核优化又被回滚,然后又开新提案?
android·前端·flutter
Kapaseker9 小时前
领导问我 Kotlin 的 Nothing 是什么?
android·kotlin
韩曙亮9 小时前
【错误记录】安卓 adb 调试 5037 端口占用排查 ( adb 的三层结构 | 找出本机占用 5037 的进程 )
android·数据库·adb·安卓·错误记录
三少爷的鞋10 小时前
不改变异步本质,只改变代码组织:Telegram 项目的 Kotlin 协程实践
android
好的佩奇19 小时前
蓝牙之广播与扫描
android·flutter·蓝牙