使用 volatile 使枚举线程安全

mar*_*inj 5 java android

我有 runnable 正在从互联网下载一些文件,它看起来如下:

class Downloader implements Runnable {
    volatile Status status;
    public void run() {
       // ...
       while (status.isInProgress()) { ... }
    }
}
Run Code Online (Sandbox Code Playgroud)

状态如下所示:

public enum Status {
    PAUSED {
        public int someData() { return 0; }
    },
    INPROGRESS {
        public int someData() { return 1; }
    }

    public abstract int someData();

    private String msg; 
    public String getSomeMsg() {
        return msg;
    }
    public void setSomeMsg(String s) {
        msg=s;
    }

    public boolean isInProgress() {
        return this == INPROGRESS;
    }
}
Run Code Online (Sandbox Code Playgroud)

当用户按下暂停按钮时,状态变量从 GUI 线程设置为 PAUSED。

代码使用java 1.6编译,针对Android平台编译。

我的问题是,像这样设置/读取 Enum 是否是线程安全的?我在这里阅读了很棒的文章:

http://javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html

我非常确信它是保存,但它并没有说太多关于枚举。

Fil*_*ges 4

因此,在页面中,可以使用volatile基元和对象(包括枚举)。此外,这是 keywork 的典型用法volatile,您可以在此处看到。

注意:假设您的循环在完成后将中断(因为您没有定义 DONE 枚举值),最坏的情况是 (i) 用户暂停并且 (ii) 下载在下一次迭代之前完成。在这种情况下,用户单击“暂停”,但会看到“下载完成”消息。