單例模式(簡單使用)
阿新 • • 發佈:2018-08-14
span on() 內部類 一個 單例 線程 類裝載 syn limit
簡介
單例模式是一種常用的軟件設計模式,其定義是單例對象的類只能允許一個實例存在。
雙重檢查模式[推薦使用]
1、線程安全
public class Singleton { //將構造器私有化
private Singleton() {}
//初始化一個靜態常量
private static volatile Singleton singleton; //構造一個靜態方法,通過它來初始化或反還對象 public static Singleton getInstance() {
//雙重檢查機制 if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
餓漢模式(靜態常量)[可用]
1、線程安全
缺點:在類裝載的時候就完成實例化,沒有達到Lazy Loading的效果。如果從始至終從未使用過這個實例,則會造成內存的浪費。
public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return INSTANCE; } }
還有一種寫法(靜態代碼塊)
public class Singleton { private static Singleton instance; static { instance = new Singleton(); } private Singleton() {} public Singleton getInstance() { return instance; } }
靜態內部類[可用]
1、線程安全
2、充分利用了靜態內部類的特性,在裏面初始化 類 實例
3、只會被初始化一次
4、只有當靜態內部類內部的屬性、方法等被調用的時候,靜態內部類才會被加載
public class Boss { // 1. 將構造器私有化 private Boss() { } // 2. 充分利用了靜態內部類的特性,在裏面初始化 Boss 實例 // - 只會被初始化一次 // - 只有當靜態內部類內部的屬性、方法等被調用的時候,靜態內部類才會被加載 static class Singleton { private final static Boss INSTANCE = new Boss(); } // 3. 提供一個公共方法,獲取實例化好之後的對象 public static Boss getInstance() { return Singleton.INSTANCE; } }
懶漢模式[不可用]
1、線程不安全
2、這種寫法起到了Lazy Loading的效果,但是只能在單線程下使用。如果在多線程下,一個線程進入了if (singleton == null)判斷語句塊,還未來得及往下執行,另一個線程也通過了這個判斷語句,這時便會產生多個實例。所以在多線程環境下不可使用這種方式
public class Singleton { private static Singleton singleton; private Singleton() {} public static Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton; } }
懶漢模式(線程安全,同步方法)【不推薦使用】
1、缺點:效率太低了,每個線程在想獲得類的實例時候,執行getInstance()方法都要進行同步。而其實這個方法只執行一次實例化代碼就夠了,後面的想獲得該類實例,直接return就行了。方法進行同步效率太低要改進。
public class Singleton { private static Singleton singleton; private Singleton() {} public static synchronized Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton; } }
。
單例模式(簡單使用)