在Java中,使用静态变量共享状态可能是导致难以调试的问题的原因,此外还常常是设计不良的症状。
例如,我知道状态可能无法在多线程应用程序中正确同步,因为不同的线程可能在其寄存器中具有不同的静态变量副本。 此外,如果具有静态变量的类由多个类加载器加载,则可能存在多个静态变量副本。
可以使用静态变量声明中的volatile
keyworkd轻松解决第一个问题(并在必要时同步对其方法的访问)。
对于第二个问题,保证只有一个实例存在且JVM中只能看到该实例的最佳方法是什么? 我在另一篇文章中发现有些人建议使用枚举:
What is an efficient way to implement a singleton pattern in Java?
但我认为如果存在多个类加载器,这将无法解决问题。
乍一看,我会考虑使用像syngleton有状态EJB这样的东西,但我想知道是否存在更轻量级的方法。
最后,还有其他与使用静态变量共享状态的技术问题(除了我上面提到的两个)我还不知道吗?。
声明:
这个问题故意排除了关于糟糕设计的讨论,这通常意味着在Java中使用静态变量来共享状态(因为这已在许多其他地方进行了适当的讨论)并且仅关注技术问题。