一:定义单件模式

   单件模式(单例模式)确保一个类只有一个实例,并提供一个全局访问点


二:单件模式(单例模式)几种实现


1.第一种,也是最简单,最常用的一种:

public class Singleton {
	private static Singleton uniqueInstance;

	public static Singleton getSingleton(){
		if(null == uniqueInstance){
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
	
	private Singleton(){}
}




2.但是这种经典的实现方式,在多线程时,不能保证这个类只有一个实例,我们可以将其同步(synchronized),解决这个问题。

public class Singleton {
	private static Singleton uniqueInstance;

	public static synchronized Singleton getSingleton(){
		if(null == uniqueInstance){
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
	
	private Singleton(){}
}



3.第二种方式是有一些问题的,我们只有第一次执行此方法时才真正需要同步,之后每次调用,我们是不需要同步的。如果应用程序总是创建并使用单件实例,或者在创建和运行时方面的负担不太繁重,你可能要急切(eagerly)创建此单件,可以采用下面种方式。

public class Singleton {
	private static Singleton uniqueInstance = new Singleton();

	public static  Singleton getSingleton(){
		return uniqueInstance;
	}
	
	private Singleton(){}
}



4.如果性能是我们关注的重点,那么我们可以采用双重检查加锁(double-checked locking),首先检查是否实例已经创建,如果没有创建,才进行同步,这样一来,只有第一次会同步,这正是我们想要的。

public class Singleton {
	private volatile static Singleton uniqueInstance;

	public static  Singleton getSingleton(){
		if(null == uniqueInstance){
			synchronized(Singleton.class){
				if(null == uniqueInstance){
					uniqueInstance = new Singleton();
				}
			}									
		}
		return uniqueInstance;
	}

	private Singleton(){}
}



5.当然,如果getSingleton()方法的性能对应用程序不是很关键,那么我们可以选择什么都不做,同步getSingleton()方法虽然简单又有效,但是我们必须知道,同步一个方法可能造成程序执行效率下降100倍,因此,如果将getSingleton()的程序用在频繁运行的地方,我们可能要重新考虑其它的方法了。


参考资料:

1.设计模式(四)----- 单态模式(Singleton)----(JAVA版)


2.Head First设计模式(中文版),中国电力出版社出版,O‘REILLY公司译----(169--190页)--单件模式