MST

星途 面试题库

面试题:Java多线程中volatile关键字的作用

请简述在Java多线程编程中,volatile关键字是如何保证内存可见性的,并举例说明在什么场景下适合使用volatile关键字。
37.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

保证内存可见性原理

  1. 工作内存与主内存:在Java内存模型中,每个线程都有自己的工作内存,线程对变量的操作都在工作内存中进行,然后再同步回主内存。普通变量在工作内存和主内存之间的同步不及时,导致线程间数据不一致。
  2. volatile作用:当一个变量被声明为volatile时,线程对该变量的修改会立即同步到主内存,并且其他线程在使用该变量时,会从主内存重新读取最新值,从而保证了不同线程之间对该变量的内存可见性。

适用场景举例

  1. 状态标记变量
public class VolatileExample {
    private volatile boolean flag = false;

    public void startTask() {
        new Thread(() -> {
            while (!flag) {
                // 等待标记变为true
            }
            System.out.println("Task started");
        }).start();
    }

    public void stopTask() {
        flag = true;
    }
}

在上述代码中,flag 被声明为 volatile,当 stopTask 方法将 flag 设置为 true 时,执行 startTask 方法的线程能够立即感知到这个变化,从而停止等待并开始执行后续任务。这种场景下 volatile 确保了不同线程对 flag 变量的内存可见性,避免了线程一直等待旧值的问题。