單例模式 8種實現方式

2022-09-15 18:48:08 字數 1976 閱讀 3487

餓漢式2種(靜態常量餓漢式、靜態**塊餓漢式)

懶漢式3種(執行緒不安全懶漢式、執行緒安全懶漢式、同步**塊懶漢式)

還有3種(雙重檢查、靜態內部類、列舉方式)

// 1.靜態常量餓漢式

public class singleton

public static singleton getinstance()

}優點:實現較為簡單,在類載入時就完成了例項化,避免了多執行緒同步問題

缺點:在類載入時就完成了例項化(使類載入的情況有很多種,不一定是呼叫getinstance()方法使類進行載入的),沒有達到懶載入的效果。如果程式從始至終未用到該例項,則造成了空間浪費

//2.靜態**塊餓漢式

public class singleton

private singleton(){}

public static singleton getinstance()

}

優缺點:同靜態常量餓漢式

//3.執行緒不安全懶漢式

public class singleton

private static singleton singleton;

public static singleton getinstance()

return singleton;

}}

//4.執行緒安全懶漢式

public class singleton

private static singleton singleton;

public static synchronized singleton getinstance()

return singleton;}}

優點:起到懶載入的效果,執行緒安全

//5.同步**塊懶漢式

public class singleton

private static singleton singleton;

public static singleton getinstance()

}return singleton;

}}

優點:懶載入

缺點:不適合多執行緒環境,可能因多個執行緒同時到達if(singleton == null)而產生多個例項,表面**看執行緒安全實際執行緒不安全

//6.雙重檢查(推薦使用)

public class singleton

private static volatile singleton singleton;

public static singleton getinstance()}}

return singleton;}}

優點:解決了同步**塊方式的執行緒安全問題

//7.靜態內部類(推薦使用)

靜態內部類的特點:

1.當外部類被裝載時,靜態內部類不會被立即裝載

2.當呼叫getinstance()時靜態內部類只被裝載一次

public class singleton

private static class singletoninstance

public static singleton getinstance()

}優點:當外部類singleton被裝載時,靜態內部類不會立即被裝載,而是在需要時才被裝載,也就是呼叫getinstance()時才被裝載,達到了懶載入的效果,這種方式採用了類載入機制來保證初始化例項時只有乙個執行緒,所以在這裡jvm

//8.列舉方式(推薦使用)

enum singleton

}優點:執行緒安全,效率高,還可防止反序列化重新建立新的物件

單例模式的應用場景:

需要被頻繁建立或銷毀的物件

建立物件時耗時或者耗費資源過多(即重量級物件),但又經常使用的物件

頻繁訪問的資料庫或檔案

設計模式 8種方式實現單例模式

1 餓漢式的兩種寫法 餓漢式的特點 在獲取單例物件之前物件就已經建立完成了。package com.juc程式設計.volatile0 public class singleeh public static singleeh getsingleeh 2.靜態 塊 private static fin...

7種方式實現單例模式

單例模式,即是整個類有且只有乙個類例項,通過這個唯一的例項為全域性提供服務。單例類的構造方法為私有的,通過乙個暴露給外界的獲取例項方法來呼叫私有構造方法,保證例項的唯一性。因為餓漢式單例在類載入時就初始化了唯一的例項 且只會初始化一次,所以,該例項是唯一的,即 執行緒安全的 因此,如果我們想要為例項...

單例模式(5種實現方式)

1.餓漢式 不支援併發 此模式只能執行在單執行緒下,且類在載入時就已經建立好了例項,不管需不需要用。package com.lys 餓漢式 public class singleton1 private static singleton1 instance new singleton1 public...