Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我很困惑,易变真的有用吗?_Java_Volatile - Fatal编程技术网

Java 我很困惑,易变真的有用吗?

Java 我很困惑,易变真的有用吗?,java,volatile,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 (!

我写了一个例子试图理解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();
}   
}
它确实像我预料的那样停止了但是,当我将volatile从close标记中移除时,我已经尝试了很多次——我希望程序不会停止,因为线程t1看不到线程t2对close变量所做的更改,但是程序每次都成功结束。所以我很困惑,现在我们可以不用volatile来完成它,挥发性物质的用途是什么?或者你能给出一个更好的例子来区分使用volatile和不使用volatile吗


谢谢大家!

内存模型只说非易失性字段的更改在其他线程中可能不可见


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

对非易失性字段的更改有时对其他线程可见,有时则不可见。它们对其他线程可见所需的时间可以根据机器正在执行的其他处理、机器上处理器芯片和内核的数量、机器上高速缓存的体系结构等数量级而变化


不过,归根结底,这归结为:有缺陷的并发代码可以在前999999次成功,但在第一百万次失败。这通常意味着它通过了所有的测试,然后在生产中失败了。因此,在编写并发代码时,尽最大努力确保代码正确是很重要的,这意味着对从多个线程访问的变量使用volatile,即使它在测试中似乎没有什么不同。

Java不能保证事情会出问题。这是调试并发性问题的难点之一。+1,但更准确地说,JMM只说对volatile字段的更改将在其他线程中可见;它没有提到任何关于非易失性字段的内容(即使是这个吹毛求疵的地方,它也在掩盖一些东西)。