1.餓漢模式
特點:應用程序啓動時,完成類加載(實例對象的創建),由此可得,加載速度慢,因類已加載完畢,從而運行時獲取對象快;
2.懶漢模式
特點:與餓漢模式相反,調用實例對象創建時慢(調用創建實例方法才進行實例對象的創建)。
代碼如下:
餓漢模式
public class Stringleton {
//1.將構造方法私有化, 不允許外面直接進行創建
private Stringleton(){
}
//2.聲明類的唯一實例, 使用 private static修飾
private static Stringleton stringleton = new Stringleton();
//3.提供一個獲取實例的方法, 使用 public static修飾
public static Stringleton getInstance() {
return stringleton;
}
}
上述代碼中的一個缺點是該類加載的時候就會直接new 一個靜態對象出來,當系統中這樣的類較多時,會使得啓動速度變慢 。現在流行的設計都是講“延遲加載”,我們可以在第一次使用的時候才初始化第一個該類對象。所以這種適合在小系統。
懶漢模式
public class Stringleton {
//1.將構造方法私有化, 不允許外面直接進行創建
private Stringleton(){
}
//2.聲明類的唯一實例, 使用 private static修飾
private static Stringleton stringleton ;
//3.提供一個獲取實例的方法, 使用 public static修飾
public static Stringleton getInstance() {
if (stringleton == null) {
synchronized (Stringleton.class) {
if (stringleton == null) {
stringleton = new Stringleton();
}
}
}
return stringleton;
}
}
上述代碼中的一次鎖住了一個方法, 這個粒度(頻率)有點大 ,改進就是隻鎖住其中的new語句就OK。就是所謂的“雙重鎖”機制。