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

带有Java枚举的单例类,用于在多线程应用程序中保存全局状态,java,multithreading,enums,singleton,Java,Multithreading,Enums,Singleton,我需要在EDT和一堆工作线程之间共享一些全局状态按钮状态。当EDT更改该值时,它需要立即显示在所有其他工作线程中。我使用Java enum设计了一个singleton类,如下所示: public enum ButtonState { INSTANCE; private volatile boolean showPhase = false; public boolean showPhase() { return showPhase;

我需要在EDT和一堆工作线程之间共享一些全局状态按钮状态。当EDT更改该值时,它需要立即显示在所有其他工作线程中。我使用Java enum设计了一个singleton类,如下所示:

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不稳定吗?
如果唯一的要求是在多线程之间共享标志,则这取决于您的用例。当您使用volatile时,您的方法看起来正确且线程安全。因此更改值对所有线程都可见。这是一个拉模型,所有工作线程都需要自己访问该标志


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

查看观察者设计模式了解更多信息线程安全观察者设计模式,您可能还想检查实现单例中的选项,我还有一个双重检查线程安全单例实现。但许多人认为,如果我们不需要延迟加载,enum是实现它的最佳方法。然而,观察者设计模式可能是一个不错的选择。我来看看。谢谢