真正的爪哇全球状态,“比”静态“更”全球化“?

时间:2016-09-26 16:21:16

标签: java global-variables classloader

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

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

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

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

3 个答案:

答案 0 :(得分:2)

系统属性在一个VM中可用,但不能跨进程。一个VM,一组属性。

另见Scope of the Java System Properties

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

正确的类加载器加载类后,static字段将按照您希望的方式运行。