一:定义单件模式
单件模式(单例模式)确保一个类只有一个实例,并提供一个全局访问点
二:单件模式(单例模式)几种实现
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版)
http://blog.csdn.net/hfreeman2011/article/details/8333325
2.Head First设计模式(中文版),中国电力出版社出版,O‘REILLY公司译----(169--190页)--单件模式