MST

星途 面试题库

面试题:Java中如何通过关键字保证可见性

在Java内存模型中,描述一下volatile关键字是如何保证变量可见性的,结合一个简单示例说明。
43.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

volatile关键字保证变量可见性原理

  1. 内存模型基础:在Java内存模型中,每个线程都有自己的工作内存,线程对变量的操作都在工作内存中进行,而主内存是所有线程共享的。当线程读取变量时,会将变量从主内存拷贝到自己的工作内存;当线程修改变量后,会将变量写回主内存。
  2. volatile作用:volatile关键字的一个重要作用是保证变量的可见性。当一个变量被声明为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的值");
    }
}

在上述示例中,flag变量被声明为volatile。子线程在一个循环中等待flag变为true,主线程在休眠1秒后将flag设为true。由于flagvolatile类型,主线程对flag的修改会立即刷新到主内存,子线程能够及时感知到这个变化,从而退出循环并结束执行。如果flag没有被声明为volatile,子线程可能会一直使用自己工作内存中的旧值false,导致无法结束循环。