MST

星途 面试题库

面试题:Java中如何通过volatile关键字解决可见性问题

在Java内存模型下,解释volatile关键字是如何保证变量的可见性的,并举出一个简单代码示例说明。
13.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

volatile关键字保证可见性原理

当一个变量被声明为volatile时,它会有以下特性来保证可见性:

  1. 禁止指令重排序volatile变量相关的操作不会和其他指令重排序,确保对volatile变量的写操作会在其他操作之前执行完成,并且对volatile变量的读操作会在其他操作之后执行开始。
  2. 内存屏障:在写操作时,会在写操作后插入一个写屏障,保证在写屏障之前的所有写操作都刷新到主内存中;在读操作时,会在读操作前插入一个读屏障,保证在读屏障之后的读操作都能读到主内存中的最新值。这样,当一个线程修改了volatile变量的值,其他线程能够立即看到这个修改。

代码示例

public class VolatileExample {
    private static volatile boolean flag = false;

    public static void main(String[] args) {
        new Thread(() -> {
            System.out.println("子线程开始执行");
            while (!flag) {
                // 等待flag变为true
            }
            System.out.println("子线程结束执行");
        }).start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        flag = true;
        System.out.println("主线程修改flag为true");
    }
}

在上述代码中,子线程会一直循环等待flag变为true。主线程在休眠1秒后将flag设置为true。由于flag被声明为volatile,主线程修改flag的值后,子线程能够立即看到这个变化,从而结束循环。如果flag没有声明为volatile,子线程可能永远无法感知到flag的变化,因为子线程可能会从自己的工作内存中读取到旧的flag值。