最近在读《Head First 设计模式》,觉得这本书很不错。在此给出单例设计模式的各种形式,示例如下:
示例一:
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
上述示例在多线程下会出现问题,会有两个甚至多个实例出现。改进如下:
示例二:
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
上述示例在性能方面会有所损失。
示例三:[双重检查锁定]
public class Singleton {
private volatile static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
示例四:
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
Singleton temp = instance;
if(temp == null){
synchronized(Singleton.class){
temp = new Singleton(); //out-of-order-writes...
}
instance = temp;
}
}
}
return instance;
}
}
示例五:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
若想要实现在第一次调用时才实例化对象,采用如下示例:
示例六:
public class Singleton {
private static class SingletonHolder{
private static Singleton instance = new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
参考资料:
http://www.ibm.com/developerworks/cn/java/j-dcl.html
http://blog.csdn.net/liushuijinger/article/details/9069801