Java、"more global" 中的真正全局状态而不是“静态”?
Truly global state in Java, "more global" than `static`?
我正在寻找一种在 Java 中维护 真正全局 变量的方法,该变量对整个 JVM 实例都有效。
如果我只是在某处使用了一个 static
字段,it will fail 如果包含该字段的 class 被不同的 class 加载器加载了多次。
我可以想出一些糟糕的方法来解决这个问题,例如只使用 JDK 标准 classes(通常应该始终由相同的 classloader 加载),或要求自定义 MBean 来保持全局状态,但这些对我来说似乎是 hack。
免责声明:我知道全局状态不好,是的,我会尽可能避免它。答应。
我能想到的不依赖于操纵容器的基类加载器的唯一可靠方法是使用 JNI。将适配器写入使用共享内存段或其他类似机制来支持全局状态的本机代码。
系统属性在整个 VM 中可用,但不能跨进程使用。一个虚拟机,一组属性。
另见Scope of the Java System Properties
如果您的问题与多个 classloader 有关,那么您需要全局对象由系统 classloader 或其他共享 classloader 加载。
如何设置取决于您 运行 您的应用程序,例如在 Tomcat 中,CATALINA_BASE/lib
文件夹中的任何 jar 文件都会添加到共享 classloader。
一旦您 class 被正确的 class 加载程序加载,static
字段将按照您希望的方式工作。
我正在寻找一种在 Java 中维护 真正全局 变量的方法,该变量对整个 JVM 实例都有效。
如果我只是在某处使用了一个 static
字段,it will fail 如果包含该字段的 class 被不同的 class 加载器加载了多次。
我可以想出一些糟糕的方法来解决这个问题,例如只使用 JDK 标准 classes(通常应该始终由相同的 classloader 加载),或要求自定义 MBean 来保持全局状态,但这些对我来说似乎是 hack。
免责声明:我知道全局状态不好,是的,我会尽可能避免它。答应。
我能想到的不依赖于操纵容器的基类加载器的唯一可靠方法是使用 JNI。将适配器写入使用共享内存段或其他类似机制来支持全局状态的本机代码。
系统属性在整个 VM 中可用,但不能跨进程使用。一个虚拟机,一组属性。
另见Scope of the Java System Properties
如果您的问题与多个 classloader 有关,那么您需要全局对象由系统 classloader 或其他共享 classloader 加载。
如何设置取决于您 运行 您的应用程序,例如在 Tomcat 中,CATALINA_BASE/lib
文件夹中的任何 jar 文件都会添加到共享 classloader。
一旦您 class 被正确的 class 加载程序加载,static
字段将按照您希望的方式工作。