Singleton类有几个不同的类加载器

lie*_*ies 14 java singleton classloader

例如,我有Singleton静态字段的类instance:

public class Singleton {

    private static Singleton instance;

    // other code, construct, getters, no matter    
}
Run Code Online (Sandbox Code Playgroud)

我可以用两个不同的类加载器加载这个类两次.我怎么能避免它?这是不安全和危险的.

另外,如果我将实例设置为null,它是否会为两个类设置为null?

Singleton singleton = Singleton.getInstance();
singleton = null;
Run Code Online (Sandbox Code Playgroud)

Sea*_*man 28

如果你想要一个真正的Singleton跨类加载器,那么你需要一个共同的父来加载有问题的类,或者你需要自己指定类加载器.

更新:从@Pshemo下面的评论中,下面博客中的一些内容可能直接来自JavaWorld文章.我已离开博客条目,因为它可能仍然可以帮助某人,但它值得知道内容最初来自哪里.

原文: 有一个博客条目为您提供了一种方法"(虽然我没有尝试过!),它看起来相当合理

正如下面的请求,我上面的链接中的代码片段 - 我建议您访问博客,但需要完整的上下文:

private static Class getClass(String classname) throws ClassNotFoundException {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    if(classLoader == null) 
        classLoader = Singleton.class.getClassLoader();
      return (classLoader.loadClass(classname));
}
Run Code Online (Sandbox Code Playgroud)

  • 你确定Sneha是该帖子的作者(或者至少是关于类加载器的一部分)吗?从我看到的帖子发表于2009年1月8日,但它看起来与相当古老的一部分相同[来自javaworld的文章](http://www.javaworld.com/article/2073352/core-java/simply-singleton .html)发表于2003年4月25日.博客上的帖子甚至包含句子"*前面的方法可以用来代替`Class.forName()`*",这看起来不在上下文中,因为之前的任何地方都没有使用过`Class.forName()`方法,这是有道理的在javaworld中,因为例10使用了反射. (3认同)
  • 这段代码实际上有什么帮助?这将如何被调用以确保单例在类加载器中仍然是单例? (2认同)
  • 这是由@AnkitKumar提供的已解散的java.net博客URL的Internet Archive Wayback Machine链接:https://web.archive.org/web/20051117213814/http://weblogs.java.net:80/blog/kirillcool /archive/2005/08/how_single_is_y.html.本文作者是Kirill Grouchnikov,标题是"你的单身实例怎么可以?" (2认同)