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 (!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/

相关文章:

java - Android Studio 看不到 ArrayList 类

java - 在 jBoss AS 7 中部署 EAR,其中包含 WAR 中的 Web 服务

java - Mac + Selenium + Chrome = 找不到 Chrome 二进制文件

c - 避免在函数调用中从 volatile static uint8_t 转换为 uint8_t?

java - 为什么我无法从表中获取数据?

java - 任何java静态/动态代码分析工具来查找我的java项目中的所有递归方法

c++ - volatile struct = struct 不可能,为什么?

c# - 在线程应用程序中使用 C# Volatile 关键字

java - volatile 是否足以更改对列表的引用?

java - 为什么线程在不同的运行方法体中表现不同?