带有Java枚举的Singleton类,用于在多线程应用程序中保存全局状态

时间:2017-07-13 04:47:02

标签: java multithreading enums singleton

我需要在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);
}
  1. 这是实现目标的正确方法还是有其他更好的方法?
  2. 我是否真的需要showPhase 易变?

1 个答案:

答案 0 :(得分:1)

这取决于你的用例,如果只需要在多个线程中共享标志,你的方法看起来正确并且线程安全,因为你使用volatile。所以更改值将对所有线程可见。这是一个拉模型全部工作线程需要自己访问该标志。

或者您可以使用上面建议的基于推送的模型使用Observer模式将标志中的任何更改推送到所有工作线程。我认为第二种方法是好的,因为它将立即通知工作者并且所有线程将获得相同的通知时间。在你的方法中可能会有延迟。