面试题答案
一键面试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
没有被声明为volatile
,thread2
中的while
循环可能永远不会结束,因为thread1
对flag
的修改,thread2
可能无法及时看到。声明为volatile
后,thread1
修改flag
的值会立即刷新到主内存,thread2
能马上获取到最新值,从而结束循环。