單例設計模式是一種物件建立模式,用於產生乙個物件的具體例項,它可以確保系統中乙個類只產生乙個例項。
好處:
單例模式的六種寫法:
步驟:私有化建構函式。
宣告本類的引用型別變數,並且使用該變數指向本類物件。
提供乙個公共靜態的方法獲取本類的物件。
//餓漢單例設計模式 ----> 保證single在在記憶體中只有乙個物件。
public
class
hungrysingleton
//提供乙個公共靜態的方法獲取本類的物件
public
static hungrysingleton getinstance()
}
不足:無法對instance例項做延遲載入
優化:懶漢
私有化建構函式。
宣告本類的引用型別變數,但是不要建立物件。
提供公共靜態的方法獲取本類的物件,獲取之前先判斷是否已經建立了本類物件,如果已經建立了,那麼直接返回物件即可,如果還沒有建立,那麼先建立本類的物件,然後再返回。
//懶漢單例設計模式 ----> 保證single在在記憶體中只有乙個物件。
public
class
lazysingleton
public
static lazysingleton getinstance()
return instance;
}}
不足:在多執行緒的情況下,無法保證記憶體中只有乙個例項
public
class
mythread
extends
thread
public
static
void
main
(string[
] args)
for(
int j=
0;j}
列印結果:
257688302
1983483740
1983483740
1983483740
1983483740
1983483740
1983483740
1388138972
1983483740
257688302
在多執行緒併發下這樣的實現無法保證例項是唯一的。
優化:懶漢執行緒安全
通過使用同步函式或者同步**塊保證
public
class
lazysafetysingleton
//方法中宣告synchronized關鍵字
public
static
synchronized lazysafetysingleton getinstance()
return instance;
}//同步**塊實現
public
static lazysafetysingleton getinstance1()
}return instance;
}}
不足:使用synchronized導致效能缺陷
優化:dcl
dcl:double check lock (雙重檢查鎖機制)
public
class
dclsingleton
public
static dclsingleton getinstance()
}}return instance;
}}
不足:在if判斷中執行的instance = new dclsingleton(),該操作不是乙個原子操作,jvm首先會按照邏輯,第一步給instance分配記憶體;第二部,呼叫dclsingleton()構造方法初始化變數;第三步將instance物件指向jvm分配的記憶體空間;jvm的缺點:在即時編譯器中,存在指令重排序的優化,即以上三步不一定會按照順序執行,就會造成執行緒不安全。
優化:給instance的宣告加上volatile關鍵字,volatile能保證執行緒在本地不會存有instance的副本,而是每次都到記憶體中讀取。即禁止jvm的指令重排序優化。即按照原本的步驟。把instance宣告為volatile之後,對它的寫操作就會有乙個記憶體屏障,這樣,在它的賦值完成之前,就不會呼叫讀操作。
注意:volatile阻止的不是instance = new dclsingleton();這句話內部的指令排序,而是保證了在乙個寫操作完成之前,不會呼叫讀操作(if(instance == null))
public
class
dclsingleton
public
static dclsingleton getinstance()
}}return instance;
}}
jvm提供了同步控制功能:static final,利用jvm進行類載入的時候保證資料同步。
在內部類中建立物件例項,只要應用中不使用內部類,jvm就不會去載入該類,就不會建立我們要建立的單例物件,
public
class
staticinnersingleton
/** * 在第一次載入staticinnersingleton時不會初始化instance,
* 只在第一次呼叫了getinstance方法時,jvm才會載入staticinnersingleton並初始化instance
* @return
*/public
static staticinnersingleton getinstance()
//靜態內部類
private
static
class
singletonholder
}
優點:jvm本身機制保證了執行緒安全,沒有效能缺陷。
public
enum enumsingleton
}
優點:寫法簡單,執行緒安全
注意:如果在列舉類中有其他例項方法或例項變數,必須確保是執行緒安全的。
單例設計模式(餓漢單例設計模式 懶漢單例設計模式)
1.什麼是單例 單例的意思是乙個類永遠只存在乙個物件,不能建立多個物件。2.為什麼要用單例 開發中有很多的物件我們只需要乙個,例如虛擬機器物件,任務管理器物件 物件越多越佔記憶體,有時候只需要乙個物件就可以實現業務,單例可以節省記憶體空間。3.如何實現單例 單例的實現方式有 餓漢單例設計模式 通過類...
設計模式 單例設計模式
歷史 最早是建築學領域的模式,然後gof四人由其引申到編碼方面,總結了23種設計模式 設計模式 解決某一類事情最行之有效的方法 2.1 體現 餓漢式,保證物件的唯一性 class singleton 私有化建構函式禁止該類建立物件 private static singleton st new si...
設計模式 單例設計模式
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...