面试题答案
一键面试volatile关键字保证变量可见性原理
- 内存模型基础:在Java内存模型中,每个线程都有自己的工作内存,线程对变量的操作都在工作内存中进行,而主内存是所有线程共享的。当线程读取变量时,会将变量从主内存拷贝到自己的工作内存;当线程修改变量后,会将变量写回主内存。
- 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
。由于flag
是volatile
类型,主线程对flag
的修改会立即刷新到主内存,子线程能够及时感知到这个变化,从而退出循环并结束执行。如果flag
没有被声明为volatile
,子线程可能会一直使用自己工作内存中的旧值false
,导致无法结束循环。