單例設計模式

2021-10-23 11:29:22 字數 1514 閱讀 8281

最好理解的一種設計模式,分為懶漢式和餓漢式:

優點 1.執行緒安全 

2.在類載入的同時已經建立好乙個靜態物件,呼叫時反應速度快 

缺點 資源效率不高,可能getinstance()永遠不會執行到,但執行該類的其他靜態方法或者載入了該類(class.forname),那麼這個例項仍然初始化 

public class singlepattern 

private static singlepattern singlepatternl = new singlepattern();

public static singlepattern getsinglepatternl()

}

優點: 

避免了餓漢式的那種在沒有用到的情況下建立事例,資源利用率高,不執行getinstance()就不會被例項,可以執行該類的其他靜態方法。 

缺點: 

懶漢式在單個執行緒中沒有問題,但多個執行緒同事訪問的時候就可能同事建立多個例項,而且這多個例項不是同乙個物件,雖然後面建立的例項會覆蓋先建立的例項,但是還是會存在拿到不同物件的情況。解決這個問題的辦法就是加鎖synchonized,第一次載入時不夠快,多執行緒使用不必要的同步開銷大。 

public class singlepattern 

private static volatile singlepattern singlepattern;

public static singlepattern getsinglepatterne() }}

return singlepattern;

}}

面試常問:

1. 什麼是單例模式?

答:單例模式也稱為單子模式,是一種常用的設計模式,單例物件的類必須保證只有乙個例項存在。

2. 懶漢式在建立例項時為什麼要進行二次判空?

第一次校驗:由於單例模式只需要建立一次例項,如果後面再次呼叫getinstance方法時,則直接返回之前建立的例項,因此大部分時間不需要執行同步方法裡面的**,大大提高了效能。如果不加第一次校驗的話,那跟上面的懶漢模式沒什麼區別,每次都要去競爭鎖。

第二次校驗:如果沒有第二次校驗,假設執行緒t1執行了第一次校驗後,判斷為null,這時t2也獲取了cpu執行權,也執行了第一次校驗,判斷也為null。接下來t2獲得鎖,建立例項。這時t1又獲得cpu執行權,由於之前已經進行了第一次校驗,結果為null(不會再次判斷),獲得鎖後,直接建立例項。結果就會導致建立多個例項。所以需要在同步**裡面進行第二次校驗,如果例項為空,則進行建立。

3. 單例例項變數為什麼要使用volitle關鍵字修飾?

原因在於jvm指令重排優化的存在。在某個執行緒建立單例物件時,在構造方法被呼叫之前,就為該物件分配了記憶體空間並將物件的字段設定為預設值。此時就可以將分配的記憶體位址賦值給instance欄位了,然而該物件可能還沒有初始化。若緊接著另外乙個執行緒來呼叫getinstance,取到的就是狀態不正確的物件,程式就會出錯。

單例設計模式(餓漢單例設計模式 懶漢單例設計模式)

1.什麼是單例 單例的意思是乙個類永遠只存在乙個物件,不能建立多個物件。2.為什麼要用單例 開發中有很多的物件我們只需要乙個,例如虛擬機器物件,任務管理器物件 物件越多越佔記憶體,有時候只需要乙個物件就可以實現業務,單例可以節省記憶體空間。3.如何實現單例 單例的實現方式有 餓漢單例設計模式 通過類...

設計模式 單例設計模式

歷史 最早是建築學領域的模式,然後gof四人由其引申到編碼方面,總結了23種設計模式 設計模式 解決某一類事情最行之有效的方法 2.1 體現 餓漢式,保證物件的唯一性 class singleton 私有化建構函式禁止該類建立物件 private static singleton st new si...

設計模式 單例設計模式

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