繁体   English   中英

Java - 使用多个类加载器的Singleton

[英]Java - Singleton usage with multiple class loaders

我在Java中有一个简单的单例类,如下所示:

public class Singleton{
    private static Singleton instance;

    private Singleton(){}

    public static Singleton getInstance(){
        if (instance == null){
            instance = new Singleton();
        }
        return instance;
    }

    public void doSomething(){
        ...
    }
}

我的代码还包含两个类,从现在开始称为A和B,它们都具有以下结构:

public class Foo{
    ...
    public void bar(){
        ...
        Singleton.getInstance().doSomething();
        ...
    }
    ...
}

在执行期间,首先执行类A中的代码,因此它以静默方式实例化单例实例。 但是,稍后当B的代码被执行时,单例实例再次被实例化,这不是我想要实现的。

经过一番调查后,我们发现A类和B类使用不同的类加载器,这意味着单例类也被加载两次,导致两个单例实例。

我在网上找到了这个问题的解决方案,并找到了几个(非常相似的)页面,例如http://www.javaworld.com/article/2073352/core-java/simply-singleton.html?page=2http://snehaprashant.blogspot.nl/2009/01/singleton-pattern-in-java.html

但是,在尝试了几个选项后,我仍然无法使其工作,主要是因为我真的不知道如何在上面列出的简单代码中应用解决方案。

所以我的问题是:有人可以为我的代码提供一个(线索)实用的解决方案来解决上面描述的问题,这样单例只会被实例化一次而不管使用的是类加载器吗?

我怀疑JavaWorld文章中的解决方案是否有效。 getContextClassLoader()Singleton.class.getClassLoader()每次都可以返回不同的类加载器。 如果你有一个一致的类加载器,那么使用该类的唯一方法是通过反射。

我猜他们希望你换掉:

Singleton.getInstance().doSomething();

有:

try {
    Object instance = getClass("package.Singleton").getMethod("getInstance").invoke(null);
    instance.getClass().getMethod("doSomething").invoke(instance);
} catch (ReflectiveOperationException e) {
    e.printStackTrace();
}

相反,我会看看为什么有多个类加载器。 要么将所有代码保存在同一个类加载器下,要么将单例放入两个类加载器的公共父级中,并使该类对子类加载器不可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM