public class VolatileExample {
private volatile boolean flag = false;
public void setFlag(boolean flag) {
this.flag = flag;
}
public boolean getFlag() {
return flag;
}
public static void main(String[] args) throws InterruptedException {
VolatileExample example = new VolatileExample();
Thread t1 = new Thread(() -> {
System.out.println("Thread 1 is waiting for flag to be true.");
while (!example.getFlag()) {
// Busy-waiting until flag becomes true
}
System.out.println("Thread 1 notices flag is true.");
});
Thread t2 = new Thread(() -> {
try {
System.out.println("Thread 2 will set flag to true after 3 seconds.");
Thread.sleep(3000);
example.setFlag(true);
System.out.println("Thread 2 has set flag to true.");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
t1.start();
t2.start();
t1.join();
t2.join();
}
}
volatile
关键字:
volatile
关键字用于确保变量的修改对所有线程立即可见。它防止了编译器和处理器对内存访问进行优化,从而避免了线程之间的可见性问题。代码逻辑:
flag
是一个用volatile
修饰的布尔变量。Thread t1
会不断地检查flag
是否为true
,如果是,则打印一条消息并退出循环。Thread t2
会在启动后等待3秒钟,然后将flag
设置为true
。flag
是volatile
的,因此当t2
修改了flag
的值时,t1
能够立即看到这个变化,而不会因为缓存或其他原因导致延迟。为什么需要volatile
:
volatile
,t1
可能会一直读取它自己缓存中的flag
值,而看不到t2
对flag
的修改,从而导致死循环。上一篇:java 验证码识别
下一篇:python调用java
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站