我很困惑,是不是真的很有用?

rol*_*luo 2 java volatile

我写了一个试图理解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();
}   
}
Run Code Online (Sandbox Code Playgroud)

它按照我的预期停了下来.但是,当我从volatile标签中取出volatile时,我已经尝试了很多次 - 我希望程序不会停止,因为线程t1无法看到线程t2对close变量所做的更改,但是程序每次都成功结束.所以我很困惑,现在我们可以做到没有挥发性,挥发性用于什么?或者你能给出一个更好的例子,它可以在使用volatile和不使用volatile之间产生影响吗?

谢谢!

Boh*_*ian 7

内存模型仅表示对非易失性字段的更改可能在其他线程中不可见.

也许您的运行时环境处于合作状态.