✅ 一、单个关键字说明 + 示例 + 应用
① static:类共享变量
| 项 | 说明 |
|---|---|
| 是否共享 | ✅ 是类级变量,所有实例共享 |
| 是否能变 | ✅ 能变 |
| 生命周期 | 随类加载而初始化,直到 JVM 退出 |
✅ 示例:
public class App {
public static int count = 0;
public void add() {
count++;
}
}
-
所有对象共用
count,是全局共享的。
✅ 应用场景:
-
配置参数、缓存、计数器、工具类方法(如
Math.random()) -
常量类中做字段容器(一般配合
final)
② final:只赋值一次(不可变引用)
| 项 | 说明 |
|---|---|
| 是否共享 | ❌ 非共享 |
| 是否能变 | ❌ 引用不能变;引用的内容可能可变 |
| 生命周期 | 与变量作用域一致 |
✅ 示例:
final int a = 10;
// a = 20; ❌ 编译错误
final List<String> list = new ArrayList<>();
list.add("x"); // ✅ 内容可变
// list = new ArrayList<>(); ❌ 引用不可变
✅ 应用场景:
-
方法参数不允许修改
-
常量定义(
final static) -
线程安全设计中的不可变对象封装(如 DTO)
③ volatile:保证多线程可见性
| 项 | 说明 |
|---|---|
| 是否共享 | ✅ 一般配合 static 共享使用 |
| 是否能变 | ✅ 能变 |
| 是否线程安全 | ❌ 不能保证原子性,只保证可见性 |
✅ 示例:
public class Worker {
public static volatile boolean running = true;
public void stop() {
running = false;
}
}
-
一个线程修改了
running,其他线程立刻能看到。
✅ 应用场景:
-
控制线程终止(
while (running)) -
状态开关、动态配置标志
-
替换整个引用对象(如配置类)
✅ 二、组合使用示例 + 应用分析
1️⃣ static final(推荐用于:常量定义)
public static final String APP_NAME = "MyApp";
| 特点说明 |
|---|
| 变量属于类(static) |
| 值不可改(final) |
| 编译期内联,性能好 |
✅ 推荐使用场景:
-
配置常量(如版本号、编码、单位)
-
枚举映射值、系统内固定参数
2️⃣ static volatile(推荐用于:线程间状态变量)
public static volatile boolean switchOn = true;
| 特点说明 |
|---|
| 所有线程共享(static) |
| 保证修改对其他线程立即可见(volatile) |
✅ 推荐使用场景:
-
热部署/热更新标志
-
控制开关(限流、熔断、功能开关)
-
线程退出标识
3️⃣ final volatile(⚠️组合少见,一般没意义)
public final volatile int x = 1; // ❌ 实际上没实际意义
| 特点说明 |
|---|
| final:你不让它变 |
| volatile:你希望变了别的线程能看到(矛盾) |
✅ 可用于保证引用不可变,但引用指向对象的字段变更是可见的,但不常用。
✅ 三、统一示例对比:到底能不能改?能否线程安全?
| 示例代码 | 能不能变? | 是不是共享? | 多线程安全? | 应用场景 |
|---|---|---|---|---|
static int counter = 0; | ✅ 可以变 | ✅ 是 | ❌ 否 | 所有实例共享计数器 |
final String name = "abc"; | ❌ 不可变 | ❌ 否 | ✅ 是(引用) | 本地常量或方法参数 |
volatile boolean running = true; | ✅ 可以变 | ✅ 是 | ⚠️ 只保证可见性 | 线程控制标志 |
static final int MAX_SIZE = 100; | ❌ 不可变 | ✅ 是 | ✅ 是 | 配置常量,全局唯一 |
static volatile boolean FLAG = true; | ✅ 可以变 | ✅ 是 | ✅ 可见性保证 | 多线程共享状态标识 |
final List list = new ArrayList(); list.add("x"); | ✅ 内容变 | ❌ 否 | ⚠️ 不安全 | 不可重新赋值,但内容可变,非线程安全 |
🎯 四、通俗总结(可直接用在面试)
static是变量归类共享,final是变量/引用不允许再改,volatile是保证多线程可见。组合使用时如static final常用于定义不可变全局常量,而static volatile常用于线程间共享状态。
🧠 五、加分回答建议(项目中举例)
面试加分说法:
我们在业务中用
static volatile boolean isGrayRelease控制是否开启灰度功能;使用定时任务更新配置时直接替换整个配置引用,引用变量用volatile修饰,能确保线程读取的是最新配置对象。

3033

被折叠的 条评论
为什么被折叠?



