單例設計模式

2021-09-08 17:12:46 字數 3177 閱讀 4652

單例設計模式是一種物件建立模式,用於產生乙個物件的具體例項,它可以確保系統中乙個類只產生乙個例項。

好處:

單例模式的六種寫法:

步驟:私有化建構函式。

宣告本類的引用型別變數,並且使用該變數指向本類物件。

提供乙個公共靜態的方法獲取本類的物件。

//餓漢單例設計模式 ----> 保證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...

設計模式 單例設計模式

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...