它的運作方式是這樣的: 如果你建立了乙個物件, 同時過一會兒後你決定再建立乙個新物件, 此時你會獲得之前已建立的物件, 而不是乙個新物件。
注意, 普通建構函式無法實現上述行為, 因為建構函式的設計決定了它必須總是返回乙個新物件。
和全域性變數一樣, 單例模式也允許在程式的任何地方訪問特定物件。 但是它可以保護該例項不被其他**覆蓋。
所有單例的實現都包含以下兩個相同的步驟:
(1)將預設建構函式設為私有, 防止其他物件使用單例類的 new運算子。
(2)新建乙個靜態構建方法作為建構函式。 該函式會 「偷偷」 呼叫私有建構函式來建立物件, 並將其儲存在乙個靜態成員變數中。 此後所有對於該函式的呼叫都將返回這一快取物件。
一上來就載入物件,問題是可能會浪費記憶體
public
class
esingleton
public
static esingleton getinstance()
}
用的時候才會載入物件
下面的方式寫的話,單執行緒下單例ok,多執行緒下就有問題會出現多個,就沒有實現單例
public
class
lsingleton
/**
* 單執行緒下單例ok,多執行緒下就有問題會出現多個
* @return
*/public
static lsingleton getinstance()
return lsingleton;
}public
static
void
main
(string[
] args)).
start()
;}}}
雙重檢測鎖模式的 懶漢式單例 dcl懶漢式
解決了併發的問題,volatile關鍵字解決了原子性
如果不加volatile
不是原子性操作
分配記憶體空間
執行構造方法,初始化物件
把這個物件指向這個空間
預想的排序,123
出現指令重排
a執行緒先執行了 13 將空物件指向 空間
b執行緒:由於已經指向了空間,就認為不為null,return的時候此時並沒有完成構造,就要加volatile(防止指令重排)
問題:通過反射來建立物件的話就會有問題,並不是單例的
三重檢測鎖模式的 懶漢式單例public
class
lsingleton
/**
* 雙重檢測鎖模式的 懶漢式單例 dcl懶漢式
* 會處理併發的問題,併發狀態下只有乙個
* @return
*/public
static lsingleton getinstance()
}}return lsingleton;
}public
static
void
main
(string[
] args)
throws exception
}
就算物件全用反射建立,就會直接報錯
如果對應已經單例建立,再用反射建立一樣會拋異常
public
class
lsingleton
else}}
/**
* 雙重檢測鎖模式的 懶漢式單例 dcl懶漢式
* 會處理併發的問題,併發狀態下只有乙個
常用設計模式 單例模式
1.單例模式的特點 1.單例類在系統中僅有乙個例項 2.單例類必須自己建立自己的例項 3.單例類必須向系統中的其他物件提供這個例項 2.單例模式的兩種模式 public class test 2.1 餓漢模式 public class singleton 建立類的唯一例項 private stati...
常用設計模式 單例模式
一 單例模式定義 單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。在計算機系統中,執行緒池 快取 日誌物件 對話方塊 印表機 顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。每台計算機可以有若干個印表機,但只能有乙個printer spooler,...
常用設計模式 單例模式
應用執行過程當中,只有乙個物件的模式,叫做單例模式 1.構造器私有 2.提供可以獲得物件的靜態方法 3.將物件設定為靜態 懶漢模式 用的時候再建立 餓漢模式 載入的時候就建立 public class singleton 構造器私有,無法在外部例項化這個物件 外部一千一萬個物件也都只能是對perso...