这个类是在项目I中定义的。项目II和项目III都依赖于项目I。
public class A {
private static volatile int schemaVersion = -1;
public synchronized void incrementSchemaVersion() {
value++;
}
}
项目II和项目III有Spring应用程序上下文,它们创建了生命周期portlet。
我希望当一个线程在项目II应用程序上下文中工作并增加schemaVersion的值时,该值对于在项目III应用程序上下文中工作的任何其他线程都是可见的。
事实并非如此。
我有从项目II中增加模式版本值的代码。这个变化发生了,我检查过了。稍后,当项目III进来并尝试检查schemaVersion值时,它仍然是-1。
spring对静态值做一些奇怪的事情吗?每个JVM不应该有一个静态值吗?
据我所知,这可能发生的唯一方法是,如果类A
分别加载,使用不同的类加载器,为每个项目。在这种情况下,你最终会得到三个不同的A
副本,每个副本都有自己的static
字段,称为schemaVersion
。
对其中一个的更改将不会反映在另一个中。
您需要通过放入一些东西来检查这一点,以查看三个项目的类装入器是否相同。您可以使用类似
这样的命令访问类装入器ClassLoader loader = A.class.getClassLoader();
从三个项目中执行,看看您最终是否得到相同的loader
。
请注意,getClassLoader()
可以返回null
,在这种情况下,这意味着类是由引导类加载器加载的。