5

我已经运行它正在从互联网下载一些文件,它看起来如下:

class Downloader implements Runnable {
    volatile Status status;
    public void run() {
       // ...
       while (status.isInProgress()) { ... }
    }
}

状态如下:

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;
    }
}

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

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

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

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

我很相信它是保存的,但它并没有说太多关于枚举。

4

2 回答 2

4

因此,在页面中,可以同时使用volatile原语和对象(包括枚举)。此外,这是volatile您可以在此处看到的键工作的典型用法。

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

于 2012-10-02T18:08:43.987 回答
1

我假设您有多个线程从“状态”中读取值。如果是这样,代码是“保存”的,以volaile确保您的 CPU 在处理时始终具有“新鲜”值(它无法从缓存中读取它)。但这不会阻止任何并发更改或其他东西,我只会保证如果某个线程更改该值,其他线程将读取该更改的值。

于 2012-10-02T17:40:28.140 回答