论坛首页 Java企业应用论坛

学习单例模式

浏览 16527 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (6) :: 隐藏帖 (9)
作者 正文
   发表时间:2008-12-19  
yunhaifeiwu 写道
nairuo1988 写道
第一个是单线程下,在多线程下为防止并发访问导致实例化2个出来,要用第2个,更好的方法是:
  public static Singleton getInstance(){
     if(instance == null)
         synchronized(Singleton.Class){
             if(instance == null)
                 instance = new Singleton();
         }
     }
     return instance;
}

双重检查加锁,只在第一次调用getInstance()时才要同步,提高性能


打板子!看我发的网址,有多线程下,大多数单例模式的应用进行了测试与介绍。如果有兴趣,自已照他的方法检查你的双重检查加锁吧!


你发的网址在那里?感觉她写的没问题啊
0 请登录后投票
   发表时间:2008-12-19  
xieke 写道
yunhaifeiwu 写道
nairuo1988 写道
第一个是单线程下,在多线程下为防止并发访问导致实例化2个出来,要用第2个,更好的方法是:
  public static Singleton getInstance(){
     if(instance == null)
         synchronized(Singleton.Class){
             if(instance == null)
                 instance = new Singleton();
         }
     }
     return instance;
}

双重检查加锁,只在第一次调用getInstance()时才要同步,提高性能


打板子!看我发的网址,有多线程下,大多数单例模式的应用进行了测试与介绍。如果有兴趣,自已照他的方法检查你的双重检查加锁吧!


你发的网址在那里?感觉她写的没问题啊

http://www.iteye.com/topic/60179
0 请登录后投票
   发表时间:2008-12-20  
nairuo1988 写道
第一个是单线程下,在多线程下为防止并发访问导致实例化2个出来,要用第2个,更好的方法是:
  public static Singleton getInstance(){
     if(instance == null)
         synchronized(Singleton.Class){
             if(instance == null)
                 instance = new Singleton();
         }
     }
     return instance;
}

双重检查加锁,只在第一次调用getInstance()时才要同步,提高性能



我在《Head First设计模式》这本书上看到过这种。那上面写了三种。
1.如果getInstance()的性能对应用程序不是很关键,就什么都别做。
2.使用‘急切’创建实例,而不用延迟实例化的做法。
3.就是上面这种。用‘双重检查加锁’,在getInstance()中减少使用同步。
0 请登录后投票
   发表时间:2008-12-27  
第一个例子是急切模式,第二个是延迟实例化模式,还有一种双重检验加锁模式(对第二个的优化)
public class Singleton {//volatile在早前版本的实现中会导致双重检验加锁的
                        //失败,故请使用java 5及更新的版本
private volatile static Singleton uniqueInstance;
private Singleton(){}

public static Singleton getInstance(){
if(uniqueInstance == null){
synchronized(Singleton.class){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
0 请登录后投票
   发表时间:2008-12-27  
个人对使用synchronized的看法是诚然他可能会减低你的程序性能,但使用不使用应该看你的软件的需要而定。软件开发受各种因素(安全、性能等)影响,有时候不能要了性能就丢了安全性,所以就解决方案来说没有最好,只有最适合。

话说回来,单件模式多数情况下解决的是控制一组共享资源的问题,在多线程对资源进行结构性修改的情况下要保证程序正常运行,急切模式是不错的,但有时候又偏偏不想或不能让类被过早的实例化,那使用延迟实例化或双重检验加锁模式也是可以考虑的。
0 请登录后投票
   发表时间:2009-01-01  
构造器一定要私有化。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics