透明思考@CSDN

思考着的程序员,程序员的思考

用户操作
[即时聊天] [发私信] [加为好友]
透明@CSDNID:gigix
946869次访问,排名32好友0人,关注者13
gigix的文章
原创 361 篇
翻译 1 篇
转载 3 篇
评论 1816 篇
最近评论
sap99:www.sap99.com/,SAP99资料多多

SAP免费资料下载
http://www.sap99.com

有很多的学习资料,推荐一下,
shendl:public static AuthorizationService getInstance()

{

if(null == instance){

instance = new AuthorizationService();

}

return instanc……
lishali12345:你真的需要一直那些所谓的大师来摆弄吗?
我只是一个简单的读者而已,你总是拿一些所谓的名人大家的话来盖人,一个目的无非是想增加你自己说话的分量,其实你自己的话就压根没什么分量,基于对自己的不自信才会导致你在所有的文章中,开头以及结尾经常借大家之口来表达你要意淫的某些观点。
实在不忍心那些大家,经常就从你口之中说出来啊!
carry1002:你好,我是猎头公司carry,我们服务的对象主要是世界500强企业,现在有thougthtworks公司的职位机会,TW是敏捷方法领域的领头羊,有兴趣的朋友请和我联系,我的msn:carry.1@hotmail.com
zdonking:很好,感谢gigix前辈的经验分享。
文章分类
收藏
    相册
    我的图片
    测试
    Arrays.asList("Rod", "Jane", "Freddy");(RSS)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 singleton模式的一种变体:double-checked locking收藏

    新一篇: 跳入JAVA | 旧一篇: 从面向对象到模式再到真正的面向对象

    singleton模式的一种变体:double-checked locking

    在单线程下,我们的singleton多半是这样(java):
    class Singleton{
      private Singleton(){ //... };
      private static Singleton instance = null;
      public static Singleton getInstance
      {
        if ( instance == null )
          instance = new Singleton();
        return instance;
      };
      //...
      }

    但是在多线程环境下,这里有个问题:如果一个线程先检查了instance==null,然后开始创建新的实例;同时另一个线程又来检查instance==null(此时第一个线程的创建还没完成),然后也创建新的实例。这样就有了Singleton类的两个实例——我们的singleton模式失败了。

    所以我们应该加入同步代码。但是加在哪里呢?如果每个线程都需要同步再获得实例引用,这必然会形成一个瓶颈;如果在instance==null的检查后面加同步代码……这根本没有用。为什么?自己想想吧。

    我们应该怎么办?同步代码肯定应该在instance==null的后面,同时,在创建新对象之前应该再检查一次instance==null:
    class Singleton{
      //...
      private synchronized static void doSync(){
        //在这里同步
      }
      public Singleton getInstance(){
        if(instance==null){
          Singleton.doSync();
          if(instance==null)  // 再进行一次检查
            instance = new Singleton();
        }
        return instance;
      }

    两次检查,既避免了效率瓶颈,又避免了重复创建。这就是double-checked locking模式。

    发表于 @ 2001年10月12日 20:25:00|评论(loading...)|编辑

    新一篇: 跳入JAVA | 旧一篇: 从面向对象到模式再到真正的面向对象

    评论

    #ericmm 发表于2004-10-13 20:47:00  IP: 211.147.234.*
    这是一个错误的使用,双重检查成例仅对C/C++有效,对Java无效!具体解释请看《java与模式》中关于单例模式的说明。
    #阿木欢 发表于2005-08-10 13:03:00  IP: 61.186.252.*
    有必要用这个方法吗?这样就够了:
    private static Singleton instance = new Singleton();

    public Singleton getInstance(){
    return instance;
    }
    #Stanley_Xu 发表于2008-05-29 00:04:18  IP: 141.24.49.*
    多线程的情况下,不单单是singleton有讲究,讨论singleton只是解决了,同时读某个obj的问题,还要考虑写。一团迷思……
    #Stanley_Xu 发表于2008-05-29 00:07:57  IP: 141.24.49.*
    多线程的情况下,不单单是singleton有讲究,讨论singleton只是解决了,同时读某个obj的问题,还要考虑写。一团迷思……
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 透明@CSDN