所謂類的單例模式,就是採取一定的方法,保證在整個軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個獲得其物件例項的方法(靜態方法)。當想例項化乙個單例類的時候,必須要使用相應的獲取物件的方法,而不是使用new。
單例模式使用場景:需要頻繁的進行建立和銷毀物件、建立物件時耗時過多或耗費資源過多、工具類物件、頻繁訪問資料庫或檔案的物件(比如資料來源、session工廠等)。
單例模式共有8種方式:
1. 餓漢式(靜態常量,單執行緒下推薦使用)
class
singleton
//2.本類內部建立物件例項
private final static singleton instance=
newsingleton()
;//3.對外提供乙個公有的靜態方法,返回物件例項
public
static singleton getinstance()
}
優點:寫法簡單,在類裝載時就完成了例項化,避免了執行緒同步問題
缺點:在類裝載時就完成了例項化,沒有達到lazy loading的效果。如果從始至終沒有使用過這個例項,就會造成記憶體浪費
2. 餓漢式(靜態**塊,單執行緒下推薦使用)
class
singleton
//2.本類內部建立物件例項
private
static singleton instance;
static
//3.對外提供乙個公有的靜態方法,返回物件例項
public
static singleton getinstance()
}
優缺點同上
3. 懶漢式(執行緒不安全)
class
singleton
//2.本類內部建立物件例項
private
static singleton instance;
//3.對外提供乙個公有的靜態方法,當使用到該方法時,才去建立物件例項
public
static singleton getinstance()
return instance;
}}
優點:起到了lazy loading的效果
缺點:只能在單執行緒下使用,若在多執行緒環境下,乙個執行緒執行if(instance == null)語句,還未來得及往下執行,另外乙個執行緒也執行了該語句,就會建立多個物件例項。所以,多執行緒環境下不能使用這種方法。
4. 懶漢式(執行緒安全,同步方法)
class
singleton
//2.本類內部建立物件例項
private
static singleton instance;
//3.對外提供乙個公有的靜態方法,加入同步處理的**,解決了執行緒不安全問題
public
static synchronized singleton getinstance()
return instance;
}}
優點:解決了執行緒不安全問題
缺點:效率太低,每個執行緒想獲取類的例項時,在執行getinstance方法時都要進行同步,但其實該方法只需要執行一次例項化**就夠了,後面的執行緒想獲取例項物件,只需要直接return就可以了。因此方法進行同步效率太低。
5. 懶漢式(執行緒安全,同步**塊)
class
singleton
//2.本類內部建立物件例項
private
static singleton instance;
//3.對外提供乙個公有的靜態方法
public
static singleton getinstance()
}return instance;
}}
注意:該方法不能使用,它的本意是對第4種方法進行改進,但實際上它連最基本的執行緒安全都保證不了。因為有人這樣寫,所以這裡提一下。
6. 雙重檢查(推薦使用)
class
singleton
//2.本類內部建立物件例項
private
static
volatile singleton instance;
//3.對外提供乙個公有的靜態方法,加入雙重檢查**,既解決了執行緒不安全問題,也實現了懶載入的效果,同時保證了程式的執行效率
public
static singleton getinstance()
}}return instance;
}}
優點:進行了兩次if(instance == null)判斷,保證了執行緒安全,且物件例項化**只需要執行一次,程式效率高,同時實現了懶載入。
7. 靜態內部類(推薦使用)
class
singleton
//2.靜態內部類,該類有乙個靜態屬性singleton
private
static
class
singletoninstance
//3.外部類singleton的裝載不會導致靜態內部類的裝載,只有在呼叫該方法時,靜態內部類才會被裝載
public
static singleton getinstance()
}
優點:該方法採用類裝載的機制保證在例項化物件時只有乙個執行緒,因為靜態內部類的靜態屬性只有在第一次載入類的時候才會被初始化,所以可以保證執行緒安全。
8. 列舉(推薦使用)
enum singleton
}
優點:避免了多執行緒同步問題,同時還能防止反序列化重新建立新的例項物件 23種設計模式 單例模式
某些情況,如 執行緒池,乙個專案中匯流排程數量以及生命週期,可能需要統一控制 如果執行緒池自身可建立多個例項,那麼就無法統一控制,此時,只要能控制線程池物件的數量為乙個,那麼就可以實現統一控制的目標 注意 現實中真正使用純的單例模式並不多 如 spring bean 通過配置來決定是否使用單例 執行...
單例模式(23種設計模式)
單例模式 餓漢模式 class singletondemo public static singletondemo gets 懶漢模式 class singletondemo1 public static singletondemo1 gets return instance 單例模式,懶漢式,執行...
23種設計模式 單例模式
單例模式需要保證,構造方法一定是私有化的,並且類的全域性變數必須是靜態的,私有的 這樣才能有唯一的例項化途徑 錯誤 一 public class singleton public static singleton getinstance 上述方法,並沒有把類變數singleton設定為靜態的,這樣,...