我写了一个例子来试图理解 volatile 。
public class VolatileExample {
private volatile boolean close = false;
public void shutdown() {
close = true;
}
public void work(){
Thread t1 = new Thread(new Runnable(){
public void run(){
while (!close) {
}
}
});
Thread t2 = new Thread(new Runnable(){
public void run(){
while (!close) {
shutdown();
}
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args){
VolatileExample volatileExample = new VolatileExample();
volatileExample.work();
}
}
它确实如我所料停止了。 但是,当我从 close 标记中取出 volatile 时,我尝试了很多次---我希望程序不会停止,因为线程 t1 无法看到线程 t2 对 close 变量所做的更改,但程序每次都成功结束。所以我很困惑,既然我们可以不用 volatile 来完成,那么 volatile 是用来做什么的呢?或者你能给出一个更好的例子来区分使用 volatile 和不使用 volatile 吗?
谢谢!
最佳答案
内存模型仅表示对非 volatile 字段的更改可能在其他线程中不可见。
也许您的运行时环境处于合作状态。
关于java - 我很困惑, volatile 真的有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22649885/