單例模式
- 一、單例模式是什么?
- 二、單例模式的幾種實作方式
- 1.懶漢式 執行緒不安全
- 2. 懶漢式 執行緒安全
- 3.餓漢式
- 4.雙檢索(雙重檢索模式)
- 總結
一、單例模式是什么?
單例模式(Singleton Pattern)是最簡單的設計模式之一.
單例模式,顧名思義就是只有一個實體,并且自己負責創建自己的物件,這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要實體化該類的物件,
二、單例模式的幾種實作方式
1.懶漢式 執行緒不安全
代碼如下(示例):
/**
* 懶漢模式
* 只有用到的時候才會創建,用到的時候才會檢測是否已經實體化,如果有則回傳,沒有則進行初始化實體.
*/
public class Idler {
private static Idler instance;
private Idler() {
}
public static Idler getInstance() {
if (instance == null) {
instance = new Idler();
}
return instance;
}
}
優點:
1、在獲取實體的方法中,進行實體的初始化,節省系統資源
缺點:
1、每次獲取實體都要進行非空檢查,系統開銷大
2、非執行緒安全,當多個執行緒同時訪問getInstance()時,可能會產生多個實體
2. 懶漢式 執行緒安全
代碼如下(示例):
/**
* 懶漢模式
* 只有用到的時候才會創建,用到的時候才會檢測是否已經實體化,如果有則回傳,沒有則進行初始化實體.
* 此鎖每次呼叫 getInstance()方法都要加鎖 效率極低
*/
public class Idler {
private static Idler instance;
private Idler() {
}
public static synchronized Idler getInstance() {
if (instance == null) {
instance = new Idler();
}
return instance;
}
}
優點:
1、在獲取實體的方法中,進行實體的初始化,節省系統資源
2、執行緒安全但影響效率
缺點:
1、必須加鎖 synchronized 才能保證單例,但加鎖會影響效率,
3.餓漢式
代碼如下(示例):
/**
* 餓漢模式
* 實體在類初始化的時候就已經建好了,不管你有沒有用到,都先建好了再說,
*/
public class Hungry {
private static Hungry instance = new Hungry();
private Hungry() {
}
public static Hungry getInstance() {
return instance;
}
}
優點:
1、執行緒安全
2、獲取實體速度快
缺點:
1、類加載即初始化實體
2、記憶體浪費
4.雙檢索(雙重檢索模式)
代碼如下(示例):
/**
*雙檢鎖(雙重檢查鎖)
* synchronized 關鍵字 沒有實體化的時候才會進行加鎖.比懶漢式 加方法鎖 效率要高.
* volatile(必加)
*
* 當A/B 兩執行緒同時執行getInstance方法時,A先進入后會加鎖,B則等待.
* 此時A將instance實體化后會同步到主執行緒,A執行完后會.B會向主執行緒拷貝instance實體,
* 但此時實體已被A修改.此時instance!=null,拿到后也不會在進行新建實體
*/
public class DoubleCheck {
//volatile 必加 保證可見性和禁止指令重排序
private volatile static DoubleCheck instance;
private DoubleCheck() {
}
public static DoubleCheck getInstance() {
if (instance == null) {
synchronized (DoubleCheck.class) {
if(instance==null){
instance = new DoubleCheck();
}
}
}
return instance;
}
}
雙檢索:安全且在多執行緒情況下能保持高性能,但略復雜,
volatile關鍵字:
讀:每當子執行緒某一陳述句要用到volatile變數時,都會從主執行緒重新拷貝一份,這樣就保證子執行緒的會跟主執行緒的一致,
寫: 每當子執行緒某一陳述句要寫volatile變數時,都會在讀完后同步到主執行緒去,這樣就保證主執行緒的變數及時更新,
總結
本文首先介紹了單例模式的定義和結構,傳統的餓漢式單例無論在單執行緒還是多執行緒環境下都是執行緒安全的,但是傳統的懶漢式單例在多執行緒環境下是非執行緒安全的,雙檢鎖模式就是懶/餓 優點結合在一起的. 從而發現如果學習并發編程的話volatile關鍵詞還是非常重要的.轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/229794.html
標籤:其他
下一篇:Postman介面測驗---設定postman測驗環境(Environment),配置token全域變數,介面測驗報錯處理
