單例模式的實現(餓漢,雙重校驗鎖,巢狀類,列舉)

2021-10-08 23:53:59 字數 2257 閱讀 5285

設計模式涉及建立型模式、結構型模式和行為型模式。面試之中最常考建立型模式中的單例模式和工廠模式(因為這兩個最簡單。。。)。總結一下單例模式,之後總結工廠模式。

public

class

singleton

;// 建立私有靜態例項,意味著這個類第一次使用的時候就會進行建立

private

static singleton instance =

newsingleton()

;public

static singleton getinstance()

// 瞎寫乙個靜態方法。這裡想說的是,如果我們只是要呼叫 singleton.getdate(...),

// 本來是不想要生成 singleton 例項的,不過沒辦法,已經生成了

public

static date getdate

(string mode)

}

餓漢模式的缺點是當有多個靜態方法時候,如果使用了非建立例項的靜態方法,此時是不希望生成例項的,但是靜態方法屬於類,統一執行的,已經生成例項了。所以一般不使用這個。

public

class

singleton

;// 建立私有靜態例項,意味著這個類第一次使用的時候就會進行建立

private

static singleton instance;

public

static singleton getinstance()

// 延遲建立例項,當呼叫方法的時候才會建立例項

public

static date getdate

(string mode)

}

public

class

singleton

// 和餓漢模式相比,這邊不需要先例項化出來,注意這裡的 volatile,它是必須的

private

static

volatile singleton instance = null;

public

static singleton getinstance()

}}return instance;

}}

第一次校驗:由於單例模式只需要建立一次例項,如果後面再次呼叫getinstance方法時,則直接返回之前建立的例項,因此大部分時間不需要執行同步方法裡面的**,大大提高了效能。如果不加第一次校驗的話,那跟上面的懶漢模式沒什麼區別,每次都要去競爭鎖。

第二次校驗:如果沒有第二次校驗,假設執行緒t1執行了第一次校驗後,判斷為null,這時t2也獲取了cpu執行權,也執行了第一次校驗,判斷也為null。接下來t2獲得鎖,建立例項。這時t1又獲得cpu執行權,由於之前已經進行了第一次校驗,結果為null(不會再次判斷),獲得鎖後,直接建立例項。結果就會導致建立多個例項。所以需要在同步**裡面進行第二次校驗,如果例項為空,則進行建立。

需要注意的是,private static volatile singleton3 singleton=null;需要加volatile關鍵字,否則會出現錯誤。問題的原因在於jvm指令重排優化的存在。在某個執行緒建立單例物件時,在構造方法被呼叫之前,就為該物件分配了記憶體空間並將物件的字段設定為預設值。此時就可以將分配的記憶體位址賦值給instance欄位了,然而該物件可能還沒有初始化。若緊接著另外乙個執行緒來呼叫getinstance,取到的就是狀態不正確的物件,程式就會出錯。

public

class

singleton3

// 主要是使用了 巢狀類可以訪問外部類的靜態屬性和靜態方法 的特性

private

static

class

holder

public

static singleton3 getinstance()

}

列舉類實現單例模式相當硬核,因為列舉型別是執行緒安全的,且只會裝載一次。使用列舉類來實現單例模式,是所有的單例實現中唯一一種不會被破壞的單例模式實現。

public

class

singletonobject

private

enum singleton

private singletonobject getinstance()

}public

static singletonobject getinstance()

}

雙重校驗鎖實現單例模式

1 先上 public class singleton public static singleton getinstance return instance 2 分析 第一次校驗 instance null 單例模式只需要建立乙個例項,假如例項不為空則不需要去競爭鎖,提高效能 第二次校驗 inst...

單例模式的思想,餓漢模式,懶漢模式,雙重校驗鎖

單例模式 乙個類只有乙個物件 單例模式包括 餓漢模式和懶漢模式 懶漢模式 直到要用到例項時,才會去載入。時間換空間 缺點 在多執行緒併發情況下,會產生多個例項化物件,出現執行緒安全問題 重新上傳 取消 餓漢模式 一開始就載入好了,每次用到就直接返回 用空間換時間 重新上傳 取消 總結 1 單例模式類...

單例模式 雙重校驗鎖

單例模式 雙重校驗鎖 author szekinwin public class singleton3 私有化構造方法 private static volatile singleton3 singleton null public static singleton3 getinstance ret...