明月松间照 清泉石上流


                                        ——— 兵临城下   猫科动物
posts - 70, comments - 137, trackbacks - 0, articles - 23
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

singleton的一点疑问

Posted on 2006-11-29 15:07 兵临城下 阅读(430) 评论(7)  编辑  收藏 所属分类: Java EE
一般Singleton模式通常有几种形式:
第一种形式:

public class Singleton {

  private Singleton(){}

  private static Singleton instance = new Singleton();

  public static Singleton getInstance() {
    return instance;   
   }
}

第二种形式:

public class Singleton {

  private static Singleton instance = null;
         
        private Singleton(){}

  public static synchronized Singleton getInstance() {

  if (instance==null)
    instance=new Singleton();
  return instance;   }

}

都说第二种形式是lazy initialization,也就是说第一次调用时初始Singleton,不用每次都进行生成对象实例,提高了效率。
我的疑问是:第一种形式每次通过Singleton.getInstance()就会多次生成实例吗?instance 不是static的吗,也只初始化一次啊!
还有第二种形式中的synchronized 为什么是必须的?不明白,望指点!

评论

# re: singleton的一点疑问  回复  更多评论   

2006-11-29 18:19 by jrobot_堪
第一种形式也不会生成多个实例的,每次都是返回的类初始化时构造的对象
第二种形式由于在调用方法时才生成实例并返回,考虑到可能多线程同时访问这个方法时,可能生成多个实例的情况,必须加synchronized关键字让方法变为同步,这样同一时间只能一个线程执行这个方法.

# re: singleton的一点疑问  回复  更多评论   

2006-11-29 21:56 by 兵临城下
哦!线程安全!懂了,那相比而言,第一种形式是比较安全的。
那第二种形式并不比第一种形式效率高啊,怎么说是提高了效率呢?

# re: singleton的一点疑问  回复  更多评论   

2006-11-30 02:59 by jrobot[匿名]
个人感觉对一般的程序普通的这两种写法都是可以的
至于效率,应该是第一种高些,因为没有同步,不过也可能会有问题
这有一篇文章,超详细的米仔细看- -,你感兴趣去研究吧
http://www.blogjava.net/dreamstone/archive/2006/11/04/79026.aspx

# re: singleton的一点疑问  回复  更多评论   

2006-11-30 09:24 by 兵临城下
谢了,太复杂了,字节码分析!
以后就用第一种形式了!

# re: singleton的一点疑问  回复  更多评论   

2006-11-30 18:42 by Zou Ang
我觉得是因为第一种方式会在类加载的时候就初始化instance,而第二种会在使用时初始化,中间有一段时间不用吧~~

# re: singleton的一点疑问  回复  更多评论   

2006-11-30 19:58 by 兵临城下
不对吧,这两个单态类只能通过Singleton.getInstance()来创建对象,所以应该都是调用时才初始化,不存在你所说的情况!

# re: singleton的一点疑问  回复  更多评论   

2006-12-10 05:07 by 小贺
第一种是类加载时生成实例,第二种是调用方法时生成实例,生成实例也要占用内存影响效率,在需要的时候再生成实例,感觉第二种更有效率。

只有注册用户登录后才能发表评论。


网站导航: