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

相关推荐
angerdream1 小时前
Android手把手编写儿童手机远程监控App之SQLite详解
android
阿巴斯甜1 小时前
必看5
android
雪铃儿2 小时前
Shorebird 之外,Flutter Android 热更新还有什么选择
android·前端
张筱竼3 小时前
Android开发中的MVC、MVP与MVVM详解
android
阿巴斯甜6 小时前
必看4
android
Carson带你学Android6 小时前
Android 17 最后一个 Beta 发布,7 件事必须现在做
android·ai编程
ooseabiscuit6 小时前
Laravel 9.x重磅升级:PHP8新特性全解析
android
帅次6 小时前
深入 MaterialTheme:掌握 ColorScheme 与 Typography 的设计核心
android·kotlin·gradle·android jetpack·compose