面试题答案
一键面试保证内存可见性原理
- 工作内存与主内存:在Java内存模型中,每个线程都有自己的工作内存,线程对变量的操作都在工作内存中进行,然后再同步回主内存。普通变量在工作内存和主内存之间的同步不及时,导致线程间数据不一致。
- volatile作用:当一个变量被声明为volatile时,线程对该变量的修改会立即同步到主内存,并且其他线程在使用该变量时,会从主内存重新读取最新值,从而保证了不同线程之间对该变量的内存可见性。
适用场景举例
- 状态标记变量:
public class VolatileExample {
private volatile boolean flag = false;
public void startTask() {
new Thread(() -> {
while (!flag) {
// 等待标记变为true
}
System.out.println("Task started");
}).start();
}
public void stopTask() {
flag = true;
}
}
在上述代码中,flag
被声明为 volatile
,当 stopTask
方法将 flag
设置为 true
时,执行 startTask
方法的线程能够立即感知到这个变化,从而停止等待并开始执行后续任务。这种场景下 volatile
确保了不同线程对 flag
变量的内存可见性,避免了线程一直等待旧值的问题。