MST
星途 面试题库

面试题:网络编程中多线程编程的内存模型与可见性问题 - 中等难度

在多线程网络编程场景下,假设你有一个共享变量用于记录网络连接的状态,不同线程会读取和更新这个变量。请描述Java中volatile关键字如何解决该变量的可见性问题,并举例说明。
20.9万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试

volatile关键字解决可见性问题的原理

在多线程环境下,每个线程都有自己的工作内存,会将共享变量从主内存拷贝到自己的工作内存进行操作。操作完成后再写回主内存。普通共享变量的读写操作存在可见性问题,即一个线程对变量的修改,其他线程可能无法及时感知。

volatile关键字的作用是:当一个变量被声明为volatile时,它会确保对该变量的读/写操作直接在主内存中进行,而不是在工作内存中进行缓存。这样,当一个线程修改了volatile变量的值,会立即刷新到主内存,其他线程读取该变量时,会直接从主内存获取最新值,从而保证了可见性。

示例代码

public class VolatileExample {
    private volatile boolean flag = false;

    public void setFlag() {
        flag = true;
    }

    public void checkFlag() {
        while (!flag) {
            // 线程在这里等待,直到flag变为true
        }
        System.out.println("Flag is true, exiting loop.");
    }

    public static void main(String[] args) {
        VolatileExample example = new VolatileExample();

        Thread thread1 = new Thread(() -> example.setFlag());
        Thread thread2 = new Thread(() -> example.checkFlag());

        thread2.start();
        thread1.start();
    }
}

在上述代码中,flag变量被声明为volatile。如果flag没有被声明为volatilethread2中的while循环可能永远不会结束,因为thread1flag的修改,thread2可能无法及时看到。声明为volatile后,thread1修改flag的值会立即刷新到主内存,thread2能马上获取到最新值,从而结束循环。