A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张向辉 于 2013-1-16 12:28 编辑

为什么急切初始化会比延迟初始化更早被初始化?如下代码:

public class Singleton {
         Singleton1(){}
         private final static Singleton sInstance=new Singleton();

         public static Singleton getlnstance(){
            return sInstance;
         }
}

请问sInstance 的初始化发生在什么时候? 我理解它发生在getlnstance()函数被调用时。原因如下:

sInstance 的赋值对象不是一个常量(是一个变量,即Singleton()),所以它应该在自己被调用时才初始化。也就是getlnstance()调用时。

请问我的理解对吗?

在Effective java 中还提到一种延迟初始化的方式

public class Singleton {
         Singleton1(){}
         private static class SingletonHolder {
               final static Singleton holder=new Singleton();

         }
         public static Singleton getlnstance(){
            return SingletonHolder.holder;
         }
}

在这种方式下 Singleton 的初始化时间也是getlnstance()调用时, 请问与前一种方式相比有什么好处呢?为什么这种方式就能达到延迟初始化的效果呢?              

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
第一种是Singleton.class被加载就会实例化instance(成员变量) 你在调用getlnstance()  其实这个instance早就实例化了  只是你在调用getlnstance()的时候 才去把它取出来用 他之前就准备好了。


第二种因为SingletonHolder类没有被主动使用(成员方法),只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,然后达到延迟的目的(参考了网上的资料的

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
延迟初始化。 指全局的单例实例在第一次被使用时构建。  急切初始化。 指全局的单例实例在类装载时构建。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马