餓漢式:
public class Singleton{
private static Singleton singleton = new Singleton ();
private Singleton (){}
public Singleton getInstance(){return singletion;}
}
懶漢式1:
public class Singleton{
private static Singleton singleton = null;
public static synchronized getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
懶漢式2
public class LazySignleton {
private static LazySignleton INSTANCE = null;
//私有化構造子,阻止外部直接實例化對象
private LazySignleton(){
}
// 獲取類的單例實例
public static LazySignleton getInstance(){
if(INSTANCE == null){
synchronized (LazySignleton.class) {
if(INSTANCE == null){
INSTANCE = new LazySignleton();
}
}
}
return INSTANCE;
}
}
比較:
餓漢式是線程安全的,在類創建的同時就已經創建好一個靜態的對象供系統使用,以後不在改變
懶漢式如果在創建實例對象時不加上synchronized則會導致對對象的訪問不是線程安全的
推薦使用第一種