我需要在EDT和一堆工作线程之间共享一些全局状态(按钮状态)。当EDT更改该值时,它需要立即出现在所有其他工作线程中。我用Java枚举设计了一个单例类,如下所示:
public enum ButtonState {
INSTANCE;
private volatile boolean showPhase = false;
public boolean showPhase() {
return showPhase;
}
public void setShowPhase(boolean showPhase) {
this.showPhase = showPhase;
}
}
//Client Code:
if (ButtonState.INSTANCE.showPhase()) {
// show phase
// do stuff
ButtonState.INSTANCE.setShowPhase(false);
}
showPhase
易变??答案 0 :(得分:1)
这取决于你的用例,如果只需要在多个线程中共享标志,你的方法看起来正确并且线程安全,因为你使用volatile。所以更改值将对所有线程可见。这是一个拉模型全部工作线程需要自己访问该标志。
或者您可以使用上面建议的基于推送的模型使用Observer模式将标志中的任何更改推送到所有工作线程。我认为第二种方法是好的,因为它将立即通知工作者并且所有线程将获得相同的通知时间。在你的方法中可能会有延迟。