單例模式的各種實現
單例模式
模式動機
對於系統中的某些類來說,只有一個例項很重要,如一個系統中只有一個計時工具和ID(序號)生成器。
單例模式適用情況包括:系統只需要一個例項物件;客戶呼叫類的單個例項只允許使用一個公共訪問點。
定義
顧名思義,用來保證一個物件只能建立一個例項,除此之外,它還提供了對例項的全域性訪問方法。
單例模式的要點有三個:一是某個類只能有一個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。
實現
為了確保單例例項的唯一性,所有的單例構造器都要被宣告為私有的,在通過宣告靜態方法實現全域性訪問獲得該單例例項。
懶漢式
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null)
instance = new Singleton();
return instance;
}
}
餓漢式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
雙重校驗鎖
public class Singleton {
private volatile static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
if(instance == null)
synchronized (Singleton.class){
if(instance == null)
instance = new Singleton();
}
return instance;
}
}
注意: volatile 修飾是必須的, instance = new Singleton()可以拆解為3步
1、分配記憶體
2、初始化物件
3、指向分配的地址,若發生重排序
假設A 執行緒執行了1 和 3,還沒有執行2,B執行緒來判斷是否為NULL,B執行緒 就會直接返回還沒初始化的instance,volatile可以避免重排序。
/**
* 無鎖的執行緒安全單例模式
*/
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton(){}
public static synchronized Singleton getInstance(){
return instance;
}
}
靜態內部類:
通過靜態內部類的方式實現單例模式是執行緒安全的,同時靜態內部類不會在Singleton類載入時就載入,而是在呼叫getInstance()方法時才進行載入,達到了懶載入的效果。可能還存在反射攻擊或者反序列化攻擊
public class Singleton {
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
列舉實現
public enum Singleton {
INSTANCE;
public void doSomething() {
System.out.println("doSomething");
}
}
相關文章
- 單例模式的各種實現方式(Java)單例模式Java
- 單例模式:5種實現方式單例模式
- JS實現單例模式的多種方案JS單例模式
- Java 實現單例模式的 9 種方法Java單例模式
- Python單例模式(Singleton)的N種實現Python單例模式
- 五種方式實現 Java 單例模式Java單例模式
- Python 5種方法實現單例模式Python單例模式
- 實現單例模式的 9 種方法,你知道幾種?單例模式
- Java設計模式——實現單例模式的七種方式[JZOF]Java設計模式單例
- JAVA中實現單例(Singleton)模式的八種方式Java單例模式
- 設計模式學習(一)單例模式的幾種實現方式設計模式單例
- 單例模式的五種實現方式及優缺點單例模式
- DCL單例模式中的缺陷及單例模式的其他實現單例模式
- JS中的單例模式及單例模式原型類的實現JS單例模式原型
- 單例模式的幾種實現And反射對其的破壞單例模式反射
- 【設計模式】實現執行緒安全單例模式的五種方式設計模式執行緒單例
- Rust實現單例模式Rust單例模式
- PHP實現單例模式PHP單例模式
- golang實現單例模式Golang單例模式
- Python中的單例模式的幾種實現方式的及優化Python單例模式優化
- Python中實現單例模式Python單例模式
- 單例模式c++實現單例模式C++
- 單例模式實現對比單例模式
- 單例模式的 Java 實現與思考單例模式Java
- 單例模式 – 單例登錄檔與 Spring 實現單例剖析單例模式Spring
- 單例模式(下) – 聊一聊單例模式的幾種寫法單例模式
- 單例模式(下)---聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) - 聊一聊單例模式的幾種寫法單例模式
- 設計模式:單例模式的使用和實現(JAVA)設計模式單例Java
- 【php實現設計模式】之單例模式PHP設計模式單例
- 用Python實現設計模式——單例模式Python設計模式單例
- 利用static來實現單例模式單例模式
- Singleton——單例模式(8種)單例模式
- 單例模式的六種寫法單例模式
- 單例模式的七種寫法單例模式
- 單例模式的五種寫法單例模式
- Kotlin下的5種單例模式Kotlin單例模式
- 單利模式的兩種最佳實現模式