本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告

戒除浮躁,读好书,交益友


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:邢红瑞的blog
日志总数:523
评论数量:1142
留言数量:0
访问次数:9694049
建立时间:2004年12月20日




[编程感想]Singleton pattern, Double-checked Locking pattern出现的问题 
原创空间,  软件技术,  电脑与网络

邢红瑞 发表于 2007/7/4 13:03:42

最近研究设计模式,发现一个问题,最初的Singleton pattern是这样写的,class Singleton{ private static Singleton instance = new Singleton();      public instance() { return instance; }//...}后来很多程序员发现延时加载更好,这样不在类的加载时浪费时间,于是改为class Singleton   { private static Singleton instance = null;        public static instance()        { if( instance == null )           { instance = new Singleton();            }     return instance;   }  }出现了线程问题,又改为static Singleton instance; public static synchronized Singleton getInstance() {  if (instance == null)    instance == new Singleton();  return instance;}其实这段代码是很好的,看过Design Pattern java work book的人会说,package com.oozinoz.machine;public class Factory_2 {         private static Factory_2 factory;         private static final Object         classLock = Factory_2.class;           public static Factory_2 getFactory()         {            synchronized (classLock)             {                if (factory == null)                {                       factory = new Factory_2();                 }                 return factory;                }              } 同步代码块比同步方法代价小很多啊,其实这段代码有问题,这本书介绍的是错误的,这就是著名的Double-Checked Locking (DCL)问题。无论你通过何种手段,在JVM hotspot 1.5之前,你是解决不了这个问题的, Effective Java 在item 48也会说明了这个问题。java5使用volatile可以解决这个问题,public static Singleton getInstance() {  if (instance == null) {    synchronized (Singleton.class) {      if (instance == null)        instance = new Singleton();    }  }  return instance;}静态初始化,static class SingletonHolder {  static Singleton instance = new Singleton();    } public static Singleton getInstance() {  return SingletonHolder.instance;} 静态方法一旦类初始化失败,类就不可能使用,而且难于debug,出现ClassNotFoundException异常会有问题的,不建议使用。大家看sixsun的blog有DCL问题的说明 http://blogger.org.cn/blog/more.asp?name=sixsun&id=9312


阅读全文(4275) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144763827 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号