Singleton 模式详解
下面是我们常见的Singleton的写法
package example.designmodel.singleton;
public class Singleton1 {
private static Singleton1 instance;
public Singleton1(){
}
public static Singleton1 getinstance(){
if(instance == null){
instance = new Singleton1();
}
return instance;
}
}
//problem ... 多个地方去调用getinstance的时候会出问题。还是会多创建instance。于是有个Singleton2
public class Singleton2 {
private static Singleton2 instance;
public Singleton2(){
}
public static synchronized Singleton2 getinstance(){
if(instance == null){
instance = new Singleton2();
}
return instance;
}
}
//problem ... 一次只有一个可以调用getinstance,性能不是特别好,其实只有第一次需要同步,后面的调用都同步是一种累赘。于是有个Singleton3
public class Singleton3 {
private static Singleton3 instance = new Singleton3();
public Singleton3(){
}
public static Singleton3 getinstance(){
return instance;
}
}
//problem ... eagerly create急切创建实例 .如果您仍然关心性能,可使用Singleton4
package example.designmodel.singleton;
public class Singleton4 {
private volatile static Singleton4 instance;
public Singleton4(){
}
public static Singleton4 getinstance(){
if(instance == null){
synchronized(Singleton4.class){
if(instance == null){
instance = new Singleton4();
}
}
}
return instance;
}
}
//problem ... 双重加锁 JDK5以后适用。这里使用volatile标识,双重加锁