锁定老帖子 主题:学习单例模式
精华帖 (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()时才要同步,提高性能 打板子!看我发的网址,有多线程下,大多数单例模式的应用进行了测试与介绍。如果有兴趣,自已照他的方法检查你的双重检查加锁吧! 你发的网址在那里?感觉她写的没问题啊 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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()中减少使用同步。 |
|
返回顶楼 | |
发表时间: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; } } |
|
返回顶楼 | |
发表时间:2008-12-27
个人对使用synchronized的看法是诚然他可能会减低你的程序性能,但使用不使用应该看你的软件的需要而定。软件开发受各种因素(安全、性能等)影响,有时候不能要了性能就丢了安全性,所以就解决方案来说没有最好,只有最适合。
话说回来,单件模式多数情况下解决的是控制一组共享资源的问题,在多线程对资源进行结构性修改的情况下要保证程序正常运行,急切模式是不错的,但有时候又偏偏不想或不能让类被过早的实例化,那使用延迟实例化或双重检验加锁模式也是可以考虑的。 |
|
返回顶楼 | |
发表时间:2009-01-01
构造器一定要私有化。
|
|
返回顶楼 | |