詳聊單例模式

2021-10-23 06:04:20 字數 3712 閱讀 5745

發布物件使乙個物件能夠被當前範圍之外的**所使用。

物件逸出一種錯誤的發布。當乙個物件還沒有構造完成時,就使它被其他執行緒所見。

安全發布物件的4種方法

/**

* @author

* @title: singletonex1

* @description: 單例-懶漢模式-執行緒不安全

* @date 2020/4/11 15:16

*/public

class

singletonex1

// 單例物件

private

static

singletonex1 instance =

null

;// 靜態的工廠方法

public

static

singletonex1 getinstance (

)}

/**

* @author

* @title: singletonex2

* @description: 單例-餓漢模式-執行緒安全

* @date 2020/4/11 15:35

*/public

class

singletonex2

// 單例物件

private

static

singletonex2 instance =

newsingletonex2()

;public

static

singletonex2

getinstance()

}

/**

* @author

* @title: singletonex3

* @description: 單例-懶漢模式-執行緒安全-效率低

* 不推薦使用該寫法,效能開銷大

* @date 2020/4/11 15:37

*/public

class

singletonex3

// 單例物件

private

static

singletonex3 instance =

null

;public

static

synchronized

singletonex3

getinstance()

}

/**

* @author

* @title: singletouex4

* @description: 單例-懶漢模式改造-雙重同步鎖單例模式-執行緒不安全-雙重檢測機制

* 多執行緒情況下,可能會由於jvm和cpu優化,導致指令重排,從而不安全。

* @date 2020/4/11 15:40

*/public

class

singletonex4

// 單例物件

private

static

singletonex4 instance =

null

;public

static

singletonex4

getinstance()

}return instance;

}/**

* 該寫法執行緒不安全原因分析

* 在cpu 執行例項化 new singletonex4(); 的過程中,cpu 的指令順序為:

* 1、memory = allocate() 分配物件的記憶體空間。

* 2、ctorinstance() 初始化物件。

* 3、instance = memory 設定 instance 指向剛分配的記憶體。

** 單執行緒情況下,按以上指令順序是沒有問題的,

* 在多執行緒情況下,jvm和cpu優化,可能會出現指令重排

** 出現以下順序:

* 1、memory = allocate() 分配物件的記憶體空間。

* 3、instance = memory 設定 instance 指向剛分配的記憶體。

* 2、ctorinstance() 初始化物件。

** 假設現在有兩個執行緒 a 和 b

** 現在 執行緒a走到程式第 21 行 cpu執行第3指令,

* 同時,執行緒b走到程式第 18 行,會判斷 instance != null ,直接返回 instance.

* 而實際上 cpu 還沒有執行 《ctorinstance() 初始化物件。》指令

* 從而,出現執行緒不安全的情況。**/

}

/**

* @author

* @title: singletonex5

* @description: 單例-懶漢模式-執行緒安全

* @date 2020/4/11 15:44

*/public

class

singletonex5

// volatile 能杜絕指令重排,用於雙重檢測時,能保證執行緒安全

private

static

volatile

singletonex5 instance =

null

;public

static

singletonex5

getinstance()

}return instance;

}}

/**

* @author

* @title: singletonex6

* @description: 單例-餓漢模式-執行緒安全

* @date 2020/4/11 15:47

*/public

class

singletonex6

// 注意static 關鍵修飾的**塊和函式,按順序執行。

static

// 單例物件

private

static

singletonex6 instance =

null

;public

static

singletonex6

getinstance()

}

/**

* @author

* @title: singletonex7

* @description: 單例-列舉模式-執行緒安全-推薦使用該寫法-效率高

* 比懶漢模式安全,比餓漢模式效率高

* @date 2020/4/11 15:51

*/public

class

singletonex7

public

static

singletonex7

getinstance()

private

enum

singleton

public

singletonex7

getinstance()

}}

單例設計模式(注釋詳講)

1.什麼是設計模式 針對特定的問題提供的固定的最優的解決方案。在物件導向的程式語言中有23種設計模式 其中之一 單例設計模式 基本型別變數恒等比較比較的是兩個變數的值是否相等,引用型別變數恒等比較比較的是兩個引用變數引用的位址是否相等。1 餓漢式 注釋詳細解釋了為什麼這樣做 之所以叫餓漢式,是因為物...

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

單例 單例模式

簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...