设计模式之Singleton
2007-10-02 09:35
316 查看
这是一个最简单的模式,但同时也是最容易被误用、滥用的模式,怎样才能用好这个看似简单的模式呢?
在软件系统中,经常有一些类,必须保证它们在系统中只存在一个实例,才能确保逻辑的正确性以及良好的效率。例如,thread pools,caches,dialog boxes,还有Eclipse里面的preferencs设置。
下面是一个最简单的版本:
这个版本没有考虑到多线程下的执行情况。如果我们有两个线程,都在执行这一段代码,这样就会存在两个实例,怎样避免这个问题?
JVM已经在线程访问这个方法之前把静态字段初始化了,因此,在你的线程执行getInstance的时候,肯定会返回唯一的一个实例。同样的,.Net的CLR也支持同样的功能,不过,它需要的是一个静态只读字段。
或者,我么可以使用双检查:
public class Singleton{
private volatile static Singleton uniqueInstance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if (uniqueInstance == null){
synchronized (Singleton.class){
if (uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
这样,同步的代价变小了,而且volatile关键字可以保证多线程下实例访问的正确性,并且它的同步代价是很低的。
以上记述了几种单例模式的基本写法,在实际的项目中怎样用,肯定不会是这么简单的,如果诸位有什么心得,还请多多指教啊。
在软件系统中,经常有一些类,必须保证它们在系统中只存在一个实例,才能确保逻辑的正确性以及良好的效率。例如,thread pools,caches,dialog boxes,还有Eclipse里面的preferencs设置。
下面是一个最简单的版本:
这个版本没有考虑到多线程下的执行情况。如果我们有两个线程,都在执行这一段代码,这样就会存在两个实例,怎样避免这个问题?
JVM已经在线程访问这个方法之前把静态字段初始化了,因此,在你的线程执行getInstance的时候,肯定会返回唯一的一个实例。同样的,.Net的CLR也支持同样的功能,不过,它需要的是一个静态只读字段。
或者,我么可以使用双检查:
public class Singleton{
private volatile static Singleton uniqueInstance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if (uniqueInstance == null){
synchronized (Singleton.class){
if (uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
这样,同步的代价变小了,而且volatile关键字可以保证多线程下实例访问的正确性,并且它的同步代价是很低的。
以上记述了几种单例模式的基本写法,在实际的项目中怎样用,肯定不会是这么简单的,如果诸位有什么心得,还请多多指教啊。
相关文章推荐
- Singleton设计模式活学活用: 请求单一 vs 线程单一
- 设计模式学习1 Singleton
- PHP设计模式----单例模式(singleton)
- 设计模式之单件(Singleton)的应用
- 设计模式之单例模式(Singleton)
- 单例(Singleton)设计模式
- 设计模式(Design Pattern) —— 单例模式(Singleton) (一)
- 26种设计模式之Singleton(单例模式)
- 设计模式之Singleton模式
- 23种设计模式之单例模式(创建型,3 Singleton,c++实现)
- 设计模式:Singleton模式
- 在Java中应用设计模式--Singleton
- Java设计模式—singleton 单例
- [设计模式]Singleton - 单例模式
- 设计模式学习笔记(一)——Singleton
- Java设计模式透析之 —— 单例(Singleton)
- Singleton 设计模式
- 设计模式之Singleton(单态)
- 【设计模式学习笔记】Singleton单件模式
- 胖虎白话学习设计模式之多线程与单例模式设计模式(Singleton)