DANCE WITH JAVA

开发出高质量的系统

常用链接

统计

积分与排名

好友之家

最新评论

终于可以在Java中使用lazy loading的单态了

在我的这篇文章http://www.blogjava.net/dreamstone/archive/2006/11/04/79026.html中写了为什么不要使用Java的lazy loading ,即使是double-check也解决不了问题,但是有人解决了这个问题。
佩服啊。实在是巧妙,如此简单
注意:在多个虚拟机的情况下这个方法还是不能用的,但是一般情况下是可以的。
实现方式:

public   class  Singleton  {   
  
  
static   class  SingletonHolder  {   
    
static  Singleton instance  =   new  Singleton();   
  }
   
  
  
public   static  Singleton getInstance()  {   
    
return  SingletonHolder.instance;   
  }
   
  
}
  

这个写法的发明者是Google公司的Bob lee。
他还写了个轻量级IoC容器,据说不要配制文件,性能比spring快100倍。感觉100倍有些夸张,不过可以看看。

posted on 2007-02-27 20:10 dreamstone 阅读(6931) 评论(14)  编辑  收藏 所属分类: 设计模式

评论

# re: 终于可以再Java中使用lazy loading了。[未登录] 2007-02-27 20:49 cc

多此一举,Spring解决的问题不是性能问题!  回复  更多评论   

# re: 终于可以再Java中使用lazy loading了。 2007-02-27 21:15 dreamstone

这么说就无语了。
首先什么叫多此一举,哪些东西不是多此一举?
虽然有可能他的实现不能商业应用,但既然写了这个东西就“有可能”有他存在的价值。

另外我还没看他写的东西,不能说他好或者坏,但个人比较反感根本没有了解就发表误导性言论的做法。

最后webwork在新的版本已经加入了他写的IOC容器。


  回复  更多评论   

# re: 终于可以再Java中使用lazy loading了。[未登录] 2007-02-27 22:00 jini

有时间找他写的IoC来研究研究,学习学习  回复  更多评论   

# re: 终于可以在Java中使用lazy loading了。[未登录] 2007-02-28 01:04 Dennis

這種以 Initialization on Demand Holder (IODH) 的 lazy loading 方式只能, 也只可以應用在
Classloader scope 的 static scope singleton 上

對特定存取區域,或 "不確定" Classloader 情況下
只能用回 synchronized 方法

(根據 Bob lee 本人的 blog, 引述 Effective Java 一書的說明)

另, 這方法 "不是" Bob lee 本人發明的.
他也只是讀回來的, 他在 blog 中也有提到  回复  更多评论   

# re: 终于可以在Java中使用lazy loading了。[未登录] 2007-02-28 09:46 dreamstone

to Dennis:
谢谢提醒,另问一下什么情况下这个方式会失效,能不能举个例子说明一下?
  回复  更多评论   

# re: 终于可以在Java中使用lazy loading了。 2007-02-28 11:10 BeanSoft

支持一下, 不错!  回复  更多评论   

# re: 终于可以在Java中使用lazy loading了。 2007-02-28 12:10 dreamstone

嗯,找了一下Effective Java,在Item 48 找到了,果然不是Bob lee发明的,不过这种写法还是值得借鉴。另外,对与Effective Java中解释的话有些不了解,
谁能给解释一下:
这句:The only shortcoming of the idiom is that it does not work for instance fields ,only for static instance fields
虽然字面意思知到,但是还是不明白他讲的实际问题。  回复  更多评论   

# re: 终于可以在Java中使用lazy loading了。 2007-02-28 12:11 dreamstone

另外这里关于这个问题还有一些讨论,
http://weblogs.java.net/blog/kirillcool/archive/2005/08/how_single_is_y.html

而作者的做法居然是用程序写代码,临时编绎,也算够走火入魔的。不过下边的讨论还是不错的。  回复  更多评论   

# re: 终于可以在Java中使用lazy loading了。[未登录] 2007-02-28 13:27 dennis

这样的写法不是新鲜主意了,在读《设计模式精解》关于singleton那章时特意查过。  回复  更多评论   

# re: 终于可以在Java中使用lazy loading了。 2007-02-28 14:18 dreamstone

to dennis:
建议你如果回文章的话尽量提供一下支持你自己观点的资料。
不知道你说的“ 對特定存取區域,或 "不確定" Classloader 情況下”是什么情况

不然的话看文章的人懂得懂了,不懂的还不懂。

谢谢。如果我找到会补上。  回复  更多评论   

# re: 终于可以在Java中使用lazy loading的单态了[未登录] 2007-02-28 15:54 dennis

@dreamstone
sorry,我并没有别的意思。
我是在读《设计模式精解》时那章singleton时提到double-check也无法解决多线程实现singleton模式的问题时,特意google了下代码,这是我收藏夹里的文章:http://www.j2medev.com/Article/Class3/pattern/200511/1004.html  回复  更多评论   

# re: 终于可以在Java中使用lazy loading的单态了 2007-02-28 17:56 dreamstone

找到了什么情况下会有多个ClassLoader了,这篇文章中有些内容讲了为什么会有多个ClassLoader。
http://www.blogjava.net/dreamstone/archive/2007/02/28/101183.html

另to dennis:
谢谢提供资源,希望能提出更多问题,多交流。。  回复  更多评论   

# re: 终于可以在Java中使用lazy loading的单态了 2014-06-04 15:50 kizz

纯扯淡  回复  更多评论   

# re: 终于可以在Java中使用lazy loading的单态了 2016-11-11 14:29 NewSea

学习。  回复  更多评论   


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


网站导航: