此类在项目I中定义。项目II和项目III都将项目I作为依赖项。

public class A {

    private static volatile int schemaVersion = -1;

    public synchronized void incrementSchemaVersion() {
        value++;
    }

}


项目II和项目III具有Spring应用程序上下文,并且它们创建liferay Portlet。

我希望当一个在项目II应用程序上下文中工作的线程并递增schemaVersion的值时,对于在项目III应用程序上下文中工作的任何其他线程,该值将是可见的。

不是这种情况。

我有代码,可以从项目II中增加架构版本的值。我检查了一下这种变化。以后,当项目III进入并尝试检查schemaVersion值时,它仍为-1。

spring是否会对静态值做一些奇怪的事情?每个JVM是否应为一个静态值?

最佳答案

据我所知,发生这种情况的唯一方法是为每个项目使用不同的类加载器分别加载类A。在这种情况下,您将得到三个不同的A副本,每个副本都有其自己的名为staticschemaVersion字段。

这样,对一个的更改将不会在另一个中反映出来。

您需要通过放入一些东西来检查这一点,以查看三个项目的类加载器是否相同。你可以用类似的东西到达类加载器

ClassLoader loader = A.class.getClassLoader();


在三个项目中执行此操作,然后查看是否以相同的loader结尾。

请注意,getClassLoader()可以返回null,在这种情况下,这意味着该类是由引导类加载器加载的。

09-25 19:20