《Java与模式》上说,如果加载器是静态的,那么在懒汉式单例类被加载时不会将自己实例化。
问题1:何谓“加载器是静态的”
问题2:
public class LazySingleton {
    private static LazySingleton instance = null;//(1)
    
    private LazySingleton() {                    //(3)
        
    }
    
    synchronized public static LazySingleton getInstance() {    //(2)
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}
上面代码是懒汉式单例类,当加载一个LazySingleton 类时,代码的执行应该是先(1),后(2),再(3)的吧,那么,在执行(2)的时候,程序会判断instance ==null为true,接下来 instance = new LazySingleton();就会被执行,还是在加载时就生成了单例类对象啊。可是为什么书上和大家都说“在懒汉式单例类被加载时不会将自己实例化”呢?是不是我的理解有错误。求高人指点,谢谢。

解决方案 »

  1.   

    类加载时只执行private static LazySingleton instance = null;当然不会初始化,
    当第一次调用LazySingleton.getInstance()的时候才初始化所谓懒汉就是“到用的时候才去做,不用就不做”
      

  2.   


    类是什么时候被加载的呢?是在外部程序中使用LazySingleton lazySingleton = LazySingleton.getInstance();语句的时候吗?还是在使用这条语句之前?如果是在它之前,那么具体是在什么时候,请说的详细点,学习中。谢谢。
      

  3.   

       类加载只用一次(只能调用一次)
        LazySingleton lazy = new LazySingleton();开始加载
         .........    LazySingleton lazy = new LazySingleton();//已经加载完了,所以就不再加载了

      

  4.   

    其实问题就是 static 方法getInstance() 是不是在类加载时就执行的。还是在以后调用时执行。而不是单例在什么时候创建。所以几乎看不到答案。
    ===========================
    恩,楼上说的没错,类加载的时候首先是静态变量,变量,然后是诸如静态块之类的,静态方法不会马上加载的,因为方法的加载是运行期的。
    好像是静态常,变量,静态块然后才 是变量吧。 静态方法就不知道了。
    我的解释是:当使用 类加载了,静态的变量 instance 被初始化为NULL, LazySingleton.getInstance() 执行 getInstance() 然后调用构造函数。
    如果private static Singleton singleton=new Singleton(); 这样在类加载时,就已经将 singleton 实例化了。
    而不是在调用LazySingleton.getInstance()的时候。 LazySingleton lazy = new LazySingleton();==========私有构造函数可以外部调用的?