保證只有乙個物件
類載入的時候物件就已經存在,餓漢式是執行緒安全的,在類建立的同時就已經建立好乙個靜態的物件供系統使用,以後不再改變,上述例子就是乙個惡漢式
類載入的時候物件還不存在,就是所謂的延遲載入方式,需要時再進行建立,懶漢式如果在建立例項物件時不加上synchronized則會導致對物件的訪問不是執行緒安全的
public class single
// 這種情況是執行緒不安全的
public static single getinstance()
return sintance;
}}
執行緒安全
public class single
public static single getinstance()
}return sintance;
}}
看似完美,但是指令重排序會引起空指標異常
原因來自sinstance = new single();這裡可以分解為
memory = allocate(); //分配記憶體空間
ctorinstance(memory); //例項化物件
sintance = memory; //sintance 指向分配的記憶體位址
但是重排序後
memory = allocate(); //分配記憶體空間
sintance = memory; //sintance 指向分配的記憶體位址
ctorinstance(memory);//例項化物件
在jdk1.5之後使用volatile關鍵字禁止重排序
public class single
public static single getinstance()
}return sintance;
}}
public class single
private single() {}
public static single getinstance()
}
使用內部類的方式,既能保證執行緒安全,有能保證在呼叫方法的是載入這個內部類,建立的物件是隨著內部類的載入而載入的。 java中單例模式
定義 乙個類只允許產生乙個例項化物件。我們先想想類的例項化物件是如何產生的?它是通過類的構造方法產生的。現在只讓乙個類產生乙個例項化物件,我們就要考慮從它的構造方法入手,我們可以把建構函式私有化,這樣它就不能在類的外部被呼叫了。但如果我們還想在類的外部呼叫類內函式,就必須通過類的例項化物件來呼叫,但...
Java中的單例模式
一 概述 單例模式的寫法有好幾種,這裡主要有三種 懶漢式單例 餓漢式單例 登記式單例。單例模式有以下特點 1 單例類只能有乙個例項。2 單例類必須自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。在計算機系統中,...
java 中的單例模式
單例模式 一 保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點。1.構造方法私有化 2.宣告乙個本類的物件 3.給外部提供乙個靜態方法用來讓外部獲取物件例項 二 兩種實現方式 餓漢式 懶漢式餓漢式 private static single01 single new single01 餓漢式 ...