public class Singleton {
private static final Singleton instance = new Singleton();
/**
 * 防止其他人new对象
 */
private Singleton(){
System.out.println("++++init");
}
public static Singleton getInstance(){
return instance;
}
}
有人说上面这种单粒模式在Singleton对象很大的时候,系统启动会很慢。 系统启动指的是什么?
Load Class的时候? 我试过了Load Class的时候不会输出构造函数中的++++init
求各位大师的指点!!!!系统启动(初始化)指的是什么?单粒设计模式

解决方案 »

  1.   

    你这个Singleton对象很小,看不出性能问题。单例模式有两中的,饿汉和懒汉模式,你这是饿汉。
      

  2.   

    我在假设Singleton很大的时候
    我的问题是:什么时候输出++++init,我觉得是掉用getInstance到的时候输出 但是网上大部分人都说不是
      

  3.   

    系统启动慢,是因为系统启动会加载(就是初始化)很多定义的类对象,这样启动之后,调用的时候就不必new操作了。
    你的小例子改成这样试试:
    public class Singleton {
    private static final Singleton instance = null;
    /**
     * 防止其他人new对象
     */
    private Singleton(){
    System.out.println("++++init");
    }
    public static Singleton getInstance(){
    if(null == instance){
    instance = new Singleton();
    }
    return instance;
    }
    }
      

  4.   

    系统启动慢,是因为系统启动会加载(就是初始化)很多定义的类对象,这样启动之后,调用的时候就不必new操作了。
    你的小例子改成这样试试:
    public class Singleton {
    private static final Singleton instance = null;
    /**
     * 防止其他人new对象
     */
    private Singleton(){
    System.out.println("++++init");
    }
    public static Singleton getInstance(){
    if(null == instance){
    instance = new Singleton();
    }
    return instance;
    }
    }
    你这是误导啊,本来楼主的代码没有什么大问题的,只是在少数情况下提前创建了对象,可能有浪费,而你这个代码就会存在线程安全问题了。
      

  5.   

    系统启动慢,是因为系统启动会加载(就是初始化)很多定义的类对象,这样启动之后,调用的时候就不必new操作了。
    你的小例子改成这样试试:
    public class Singleton {
    private static final Singleton instance = null;
    /**
     * 防止其他人new对象
     */
    private Singleton(){
    System.out.println("++++init");
    }
    public static Singleton getInstance(){
    if(null == instance){
    instance = new Singleton();
    }
    return instance;
    }
    }
    你这是误导啊,本来楼主的代码没有什么大问题的,只是在少数情况下提前创建了对象,可能有浪费,而你这个代码就会存在线程安全问题了。
    只是举个例子,别激动嘛~咱们学单例,第一个例子不就是这样的么,慢慢来呀~
      

  6.   

    关键点在于我觉得不论什么单粒 我觉得只有调用getInstance()才会输出构造方法里面的"++++init 而不是所谓的系统启动时候
      

  7.   

    系统启动慢,是因为系统启动会加载(就是初始化)很多定义的类对象,这样启动之后,调用的时候就不必new操作了。
    你的小例子改成这样试试:
    public class Singleton {
    private static final Singleton instance = null;
    /**
     * 防止其他人new对象
     */
    private Singleton(){
    System.out.println("++++init");
    }
    public static Singleton getInstance(){
    if(null == instance){
    instance = new Singleton();
    }
    return instance;
    }
    }
    你这是误导啊,本来楼主的代码没有什么大问题的,只是在少数情况下提前创建了对象,可能有浪费,而你这个代码就会存在线程安全问题了。
    关键是在什么情况下提起创建 我问的就是这个 没有调getInstance就会创建?
      

  8.   

    系统启动慢,是因为系统启动会加载(就是初始化)很多定义的类对象,这样启动之后,调用的时候就不必new操作了。
    你的小例子改成这样试试:
    public class Singleton {
    private static final Singleton instance = null;
    /**
     * 防止其他人new对象
     */
    private Singleton(){
    System.out.println("++++init");
    }
    public static Singleton getInstance(){
    if(null == instance){
    instance = new Singleton();
    }
    return instance;
    }
    }
    你这是误导啊,本来楼主的代码没有什么大问题的,只是在少数情况下提前创建了对象,可能有浪费,而你这个代码就会存在线程安全问题了。
    关键是在什么情况下提起创建 我问的就是这个 没有调getInstance就会创建?
    你做的是在类加载的时候就会创建。
      

  9.   

    系统启动慢,是因为系统启动会加载(就是初始化)很多定义的类对象,这样启动之后,调用的时候就不必new操作了。
    你的小例子改成这样试试:
    public class Singleton {
    private static final Singleton instance = null;
    /**
     * 防止其他人new对象
     */
    private Singleton(){
    System.out.println("++++init");
    }
    public static Singleton getInstance(){
    if(null == instance){
    instance = new Singleton();
    }
    return instance;
    }
    }
    你这是误导啊,本来楼主的代码没有什么大问题的,只是在少数情况下提前创建了对象,可能有浪费,而你这个代码就会存在线程安全问题了。
    关键是在什么情况下提起创建 我问的就是这个 没有调getInstance就会创建?
    你做的是在类加载的时候就会创建。
    类加载?classLoader.load("Singleton")的时候吗? 如果是这一句 我试过了 不行