静态volatile字段在两个动态portlet中的每个Spring应用程序上下文的类中具有不同的值



这个类是在项目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,在这种情况下,这意味着类是由引导类加载器加载的。

相关内容

最新更新