volatile 和 final 在 Java 中有什么区别
volatile 保证变量的可见性和有序性,禁止指令重排序,但不保证原子性;final 保证变量只能被赋值一次,确保不可变性。两者解决的问题不同:一个针对并发读写时的内存同步,另一个针对对象状态的初始化安全与不变性。

volatile 如何影响多线程下的变量可见性
volatile 修饰的变量在写入时会立即刷新到主内存,读取时会强制从主内存重新加载,从而确保所有线程看到的都是最新值。它通过内存屏障(Memory Barrier)实现这一机制,防止编译器优化导致的指令重排。

public class VolatileExample { volatile boolean running = true; public void stop() { running = false; // 写入时刷新到主内存 } public void run() { while (running) { // 读取时从主内存加载 System.out.println("Running..."); } }}
final 如何保证对象引用的不可变性与安全性
final 修饰的变量在初始化后不能被重新赋值。对于基本类型,值是固定的;对于引用类型,引用本身不能改变,但对象内部状态可能可变。在构造函数中正确发布 final 字段可确保其他线程看到其最终值,避免“逸出”问题。
立即学习“Java免费学习笔记(深入)”;

public class FinalExample { final int value; public FinalExample(int value) { this.value = value; // 初始化后不可更改 } public int getValue() { return value; }}当 volatile 与 final 结合使用时会发生什么
若一个变量同时被 volatile 和 final 修饰,则它在初始化后既不可变又具有可见性保障。这种组合常用于单例模式或配置类中,确保线程安全且无需额外同步。注意:final 不阻止对象内部状态修改,仅限制引用绑定。


















