【问题标题】:Truly global state in Java, "more global" than `static`? [duplicate]Java 中真正的全局状态,比“静态”“更全局”? [复制]
【发布时间】:2016-09-26 16:21:15
【问题描述】:

我正在寻找一种在 Java 中维护 真正全局 变量的方法,该变量对整个 JVM 实例都有效。

如果我只是在某处使用了static 字段,it will fail 如果包含该字段的类被不同的类加载器多次加载。

我可以想到一些讨厌的方法来解决这个问题,例如只使用 JDK 标准类(通常应该始终由同一个类加载器加载),或者要求自定义 MBean 保持全局状态,但这些看起来像是 hack对我来说。

免责声明:我知道全局状态是不好的,是的,我会尽可能避免它。承诺。

【问题讨论】:

  • 如果没有别的,那么出于我自己的好奇心,请解释一下用例。
  • 使用enum。但是请注意,您想要的实际上是“un OO”。
  • @BoristheSpider 枚举解决方案与静态字段解决方案具有完全相同的问题。
  • 如果您的问题与多个类加载器有关,那么您需要由系统类加载器或其他共享类加载器加载全局对象。如何设置取决于您运行应用程序的方式,例如在 Tomcat 中,CATALINA_BASE/lib 文件夹中的任何 jar 文件都会添加到共享类加载器中。一旦你的类被正确的类加载器加载,static 字段就会做你想做的事情。

标签: java global-variables classloader


【解决方案1】:

系统属性在一个虚拟机中可用,但不能跨进程使用。一个虚拟机,一组属性。

另见Scope of the Java System Properties

【讨论】:

    【解决方案2】:

    如果您的问题与多个类加载器有关,那么您需要由系统类加载器或其他共享类加载器加载全局对象。

    如何设置取决于您运行应用的方式,例如在 Tomcat 中,CATALINA_BASE/lib 文件夹中的任何 jar 文件都会添加到共享类加载器中。

    一旦您的类被正确的类加载器加载,static 字段就会按照您希望的方式工作。

    【讨论】:

      【解决方案3】:

      我能想出的不依赖于操作容器的基类加载器的唯一可靠方法是使用 JNI。为使用共享内存段或其他类似机制来支持全局状态的本机代码编写适配器。

      【讨论】:

        猜你喜欢
        • 2011-12-11
        • 2011-01-17
        • 2022-01-28
        • 1970-01-01
        • 2010-10-31
        • 2018-12-22
        • 2015-06-12
        • 1970-01-01
        • 2020-04-06
        相关资源
        最近更新 更多