設計模式 單例模式和執行緒安全

2021-09-16 22:39:39 字數 3129 閱讀 3710

餓漢模式:例項在類載入的時候就建立好。直接上**,兩種實現方式。兩種實現方式因為都是在類載入的時候就例項化好的,所以是執行緒安全的。

/**

* 餓漢模式

* 單例例項在類裝載時進行建立

* 執行緒安全

*/public

class

singletonexample2

// 單例物件

private

static singletonexample2 instance =

newsingletonexample2()

;// 靜態的工廠方法

public

static singletonexample2 getinstance()

}

/**

* 餓漢模式

* 單例例項在類裝載時進行建立

* 執行緒安全

*/public

class

singletonexample6

// 單例物件

private

static singletonexample6 instance =

null

;static

// 靜態的工廠方法

public

static singletonexample6 getinstance()

}

懶漢模式是指在第一次獲取例項的時候才例項化單例,有可能同時會有多個執行緒去獲取單例,執行緒的安全性需要考慮。

/**

* 懶漢模式

* 單例例項在第一次使用時進行建立

* 這種方式是執行緒不安全的

*/public

class

singletonexample1

// 單例物件

private

static singletonexample1 instance =

null

;// 靜態的工廠方法

//執行緒不安全,如果執行緒a和b同時訪問這個方法

public

static singletonexample1 getinstance()

return instance;

}}

/**

* 懶漢模式

* 單例例項在第一次使用時進行建立

* 執行緒安全的 但是不推薦使用

*/public

class

singletonexample3

// 單例物件

private

static singletonexample3 instance =

null

;// 靜態的工廠方法

//synchronized修改靜態方法,保證每次只能有乙個執行緒訪問到這個方法內部

public

static synchronized singletonexample3 getinstance()

return instance;

}}

/**

* 懶漢模式 -》 雙重同步鎖單例模式

* 單例例項在第一次使用時進行建立

* 執行緒不安全**於jvm的指令重排

*/public

class

singletonexample4

//例項化物件的正常的順序

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

// 2、ctorinstance() 初始化物件

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

// jvm和cpu優化,發生了指令重排

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

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

// 2、ctorinstance() 初始化物件

// 單例物件

private

static singletonexample4 instance =

null

;// 靜態的工廠方法

//如果a執行到3,此時instance != null了,但是實際上instance還沒有建立好,

//b執行到if語句,直接返回了沒有建立好的instance,執行緒不安全

public

static singletonexample4 getinstance()

}}return instance;

}}

/**

* 懶漢模式 -》 雙重同步鎖+ volatile 關鍵字禁止指令重排,執行緒安全

* 單例例項在第一次使用時進行建立

* */

public

class

singletonexample5

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

// 2、ctorinstance() 初始化物件

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

// 單例物件 volatile + 雙重檢測機制 -> 禁止指令重排

private volatile static singletonexample5 instance =

null

;// 靜態的工廠方法

public

static singletonexample5 getinstance()

}}return instance;

}}

列舉模式

/**

*/public

class

singletonexample7

public

static singletonexample7 getinstance()

private

enum singleton

public singletonexample7 getinstance()

}}

設計模式 單例模式(執行緒安全)

前言 單例模式是設計模式中比較簡單的一種,但是又因為簡單常見在面試中又是經常出現的乙個設計模式。所以必須要會啊。之前也只是會寫執行緒不安全的單例模式。單例模式 乙個類能返回物件乙個引用 永遠是同乙個 和乙個獲得該例項的方法 必須是靜態方法,通常使用getinstance這個名稱 當我們呼叫這個方法時...

設計模式之單例模式 執行緒安全

可以說單例模式是所有設計模式中最簡單的一種。單例模式就是說系統中對於某類的只能有乙個物件,不可能出來第二個。單例模式也是23中設計模式中在面試時少數幾個會要求寫 的模式之一。主要考察的是多執行緒下面單例模式的執行緒安全性問題。1.多執行緒安全單例模式例項一 不使用同步鎖 1 public class...

設計模式之單例模式 執行緒安全

可以說單例模式是所有設計模式中最簡單的一種。單例模式就是說系統中對於某類的只能有乙個物件,不可能出來第二個。單例模式也是23中設計模式中在面試時少數幾個會要求寫 的模式之一。主要考察的是多執行緒下面單例模式的執行緒安全性問題。1.多執行緒安全單例模式例項一 不使用同步鎖 1 public class...