作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有 runnable,它正在从互联网上下载一些文件,它看起来如下:
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平台编译。
我的问题是这样设置/读取 Enum 是否是线程安全的?我在这里阅读了很棒的文章:
http://javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html
我非常相信它是保存的,但它并没有说明枚举。
最佳答案
根据this页面可以对基元和对象(包括枚举)使用 volatile
。此外,这是 volatile
键的典型用法,如您所见 here .
注意:假设您的循环在完成时会中断(因为您没有定义 DONE 枚举值),最坏的情况是 (i) 用户暂停并且 (ii) 下载在下一次迭代之前完成。在这种情况下,用户单击暂停,但会看到“下载完成”消息。
关于java - 使用 volatile 使枚举线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12695133/
我是一名优秀的程序员,十分优秀!