餓漢模式:例項在類載入的時候就建立好。直接上**,兩種實現方式。兩種實現方式因為都是在類載入的時候就例項化好的,所以是執行緒安全的。
/**
* 餓漢模式
* 單例例項在類裝載時進行建立
* 執行緒安全
*/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...