2007-03-23
Lazy Loading Singletons
关键字: design pattern
今天在论坛看见一小段代码,不得不佩服作者(blog)的创新精神。以前在使用Singleton的时候大多采用这样的方式:
但这里的问题是synchronization实际上只在getInstance()第一次调用的时候需要,这个方法在多线程频繁调用的应用中必然会成为效率的瓶颈。
到了java1.5,Bob Lee提到了 Double-Checked Locking (DCL) ,并强调了是infamous DCL;这种做法强调了效率(但Bob Lee认为volatile 不比synchronized快,另外这种做法会产生更多的代码,所以仍然坚持使用plain old synchronization),并不将整个方法synchronized,而是只对创建Singleton进行同步,这样,线程进入getInstance(),发现instance 已经创建,就会直接返回instance,而不用在方法外等待。
在这种情况下,Singleton的实现代码一般是这样:
接下来是 Bob Lee的创新做法:
JLS将保证Singleton instance只在第一次调用getInstance()的时候创建。优雅且快速!
java 代码
- public class Singleton {
- static Singleton instance;
- public static synchronized Singleton getInstance() {
- if (instance == null)
- instance = new Singleton();
- return instance;
- }
- }
到了java1.5,Bob Lee提到了 Double-Checked Locking (DCL) ,并强调了是infamous DCL;这种做法强调了效率(但Bob Lee认为volatile 不比synchronized快,另外这种做法会产生更多的代码,所以仍然坚持使用plain old synchronization),并不将整个方法synchronized,而是只对创建Singleton进行同步,这样,线程进入getInstance(),发现instance 已经创建,就会直接返回instance,而不用在方法外等待。
在这种情况下,Singleton的实现代码一般是这样:
java 代码
- static volatile Singleton instance;
- public static Singleton getInstance() {
- if (instance == null) {
- synchronized (Singleton.class) {
- if (instance == null)
- instance == new Singleton();
- }
- }
- return instance;
- }
接下来是 Bob Lee的创新做法:
java 代码
- static class SingletonHolder {
- static Singleton instance = new Singleton();
- }
- public static Singleton getInstance() {
- return SingletonHolder.instance;
- }
- 10:08
- 浏览 (590)
- 评论 (0)
- 分类: Impure Gossip
- 相关推荐
发表评论
- 浏览: 5701 次

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
圣诞,也来凑个热闹!
米国同样有很强的商业味比如圣旦....老头的红袄是由可口可乐公司赞助的.还有可恶 ...
-- by 抛出异常的爱 -
圣诞,也来凑个热闹!
pluto_t 写道没记错的话应该是二氧化硫?臭鸡蛋味 二氧化氮也还是有刺激味道 ...
-- by SunMicro -
圣诞,也来凑个热闹!
恩,恩,中国城市里的圣诞节气氛很浓,都是瞎热闹,问10个人有8个人不知道圣诞节的 ...
-- by ouspec -
圣诞,也来凑个热闹!
没记错的话应该是二氧化硫?臭鸡蛋味
-- by pluto_t -
圣诞,也来凑个热闹!
seen 写道>>聞起来才知道夹了点一氧化碳 在通常状况下,一氧化碳是无色、无 ...
-- by SunMicro






评论排行榜