單例模式有懶漢式和餓漢式
先來懶漢式
public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
以上實現單例模式不是線程安全的
if(singleton==null){
synchronized (Singleton.class) {
if(singleton == null){
singleton = new Singleton();
}
}
}
這種方式交double-check檢查兩次,保證併發安全以及性能。
餓漢式
private static Singleton singleton = new Singleton();
public Singleton(){}
public static Singleton getInstance(){
return singleton;
}
由於靜態成員是隨類加載而加載的,並且在內存中只有一份。