0

在 Java 中,使用静态变量共享状态可能是导致难以调试的问题的原因,而且通常是糟糕设计的征兆。

例如,我知道在多线程应用程序中状态可能无法正确同步,因为不同的线程可能在其寄存器中具有不同的静态变量副本。此外,如果具有静态变量的类由多个类加载器加载,则可能存在静态变量的多个副本。

使用静态变量声明中的 keyworkd 可以轻松解决第一个问题volatile(并在必要时同步对其方法的访问)。

对于第二个问题,保证只有一个实例存在并且只有那个实例在 JVM 中可见的最佳方法是什么?我在另一篇文章中发现一些人推荐使用枚举:

在 Java 中实现单例模式的有效方法是什么?

但我认为如果存在多个类加载器,这不会解决问题。

乍一看,我会考虑为此使用 syngleton 有状态 EJB 之类的东西,但我想知道是否存在更轻量级的方法。

最后,还有其他我不知道的与使用静态变量(除了我上面提到的两个)共享状态相关的技术问题吗?

免责声明:

这个问题故意排除了对不良设计的讨论,这种设计通常意味着在 Java 中使用静态变量来共享状态(因为这已经在许多其他地方进行了适当的讨论),并且只关注技术问题。

4

0 回答 0