论坛首页 入门技术论坛

单例模式(单件模式)

浏览 2250 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-29  
单件模式,就是确保一个类只有一个实例,并提供一个全局访问点。

单例的作用是独一无二,比方说,如果有一个注册表设置的对象,你不希望这样的对象有多个拷贝吧,那会把设置搞得一团乱,利用像单例这样的单件对象,可以确保程序中使用的全局资源只有一份。
单件常常被用来管理共享资源,例如数据库连接或者线程池。
/**
 * @author zhq426
 *
 */
public class Singleton {
	//利用一个静态变量来记录singleton 类的唯一实例
	private static Singleton uniqueInstance;
	
	/**
	 * 把构造器的声明为私有的,只有自singeton类内才可以构造器。
	 */
	private Singleton(){
		
	}
	
	/**
	 * 用getInstance()方法实例化对象,并返回这个实例。
	 * @return
	 */
	public static Singleton getInstance(){
		if(uniqueInstance==null){
			uniqueInstance=new Singleton();
		}
		return uniqueInstance;
	}
	
	public void test(){
		System.out.println("test singleton");
	}
	
	//other methods singleton 是一个正常的类,
        //具有一些其他用途的实例变量和方法。 

}

uniqueInstance 拥有“ 一个”实例,别忘记了,它是一个静态变量,如果uniqueInstance是空的,表示还没有创建实例,而如果不存在,我们就利用私有构造函数产生一个实例并把它赋值到静态变量中,请注意,如果我们不需要这个变量,它就永远不会产生。这就是“延迟”实例化。

以上说的是在单钱程时是不会产生多个实例的,如果在多线程呢???

1. 只要把getInstance()变成同步(synchronized)方法,多线程灾难就可以轻易的解决了,
2. 使用多线程,使效率降低了,可以使用急切创建实例的,而不用延迟实例化的做法。改方法变成
 private static Singleton uniqueInstance=new Singleton();

3. 或者使用“双重检查加锁”,在getInstance()中减少使用同步。
if(uniqueInstance==null){
			synchronized(Singleton.class){
				if(uniqueInstance==null){
					uniqueInstance=new Singleton();
				}
			}
		}

论坛首页 入门技术版

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