設計模式之單例模式複習總結

2021-09-28 10:44:20 字數 1866 閱讀 6887

單例模式

單例模式就是該類在整個程式的使用過程中有且僅有乙個例項。也就是它的構造方法是私有的,該類負責建立自己的物件,同時確保只有乙個物件被建立。當有些封裝的類會去重複載入,使用單例模式可以節省資源。

單例模式有哪些?

(還有列舉,列舉的可讀性差就先不看了)

懶漢模式

懶漢模式就是用到就通過呼叫getstance方法進行例項化。

public

class

single

public

static single getstance()

return instance;

}}

懶漢模式的情況會遇到一種問題,就是在多執行緒的情況下,在執行到if (instance == null)時時間片切換了,時間片切換到下乙個執行緒也執行if (instance == null)由於上乙個執行緒還沒有執行完例項化物件,instance是空的所以它還會new乙個物件。這樣就會有多個物件,單例模式就會失效了。解決辦法是加上同步鎖synchronized

public static synchronized single getstance(

)public

static single getstance()

return instance;

}}

那麼從一開始就new出物件,不管幾個執行緒,不管哪個執行緒執行到哪一步的時候時間片變了,裡面都已經有了這個物件了。這樣也會有個問題,無論什麼情況都要建立,浪費了記憶體資源。

雙重檢查加鎖

為了避免懶漢模式和餓漢模式所帶來的問題,可以使用雙重檢查加鎖。

public

class

single

public

static single getstance()

}}return instance;

}}

靜態內部類

在餓漢模式的時候提到,在建立類的時候就例項化物件,該方法會造成即便我不用也會建立,使得記憶體資源的浪費。這咋辦嘛?那就在第一次呼叫的時候在建立唄,並且加上關健詞final。保證記憶體空間位址值不會改變。只有第一次呼叫getinstance方法時,虛擬機器才載入 inner 並初始化instance ,只有乙個執行緒可以獲得物件的初始化鎖,其他執行緒無法進行初始化,

方便理解:new出來的物件存放在堆當中的乙個記憶體空間中,然後講物件賦值給變數,變數是在棧當中生成的,那麼在記憶體空間中使得new single()和instance相關聯的肯定不「=」,而是十六進製制的位址值,對堆中的記憶體空間位址值賦值給變數(可以直接列印變數來檢視位址值)。那麼通過加上final是的第一次賦值後變數就無法改變了,位址值沒法改變,所以記憶體空間就沒法改變,保證了物件的唯一性,從而實現單例模式。

目前此方式是所有單例模式中最推薦的模式,但具體還是根據專案選擇。

public

class

single

public

static single getstance()

private

static

class

inner

}

單例模式會被反序列化進行破壞,通過加入readresolve方法讓例項唯一
private object readresolve()

throws objectstreamexception

單例模式還會被反射破壞

在構造方法中加入securitymanager(安全管理器)來解決該問題。

好記性不如爛筆頭

設計模式複習之單例模式

單例模式 保證同乙個類只有乙個物件例項 主要複習三種實現方式 餓漢 飽漢 雙重校驗鎖 1.餓漢 模式 單例模式之餓漢模式 類載入時即建立例項物件 public class singletona public static singletona getinstance 2.飽漢模式 單例模式之飽漢模式...

設計模式複習 單例模式

單例模式,可以說是設計模式種最簡單的模式了,因為它只有乙個物件,這也就呼應了它的名字 單例模式 至於為什麼只有乙個物件,下面會進一步講述。這裡先說說單例模式的使用場景吧,在此我總結了以下幾種 1.資料共享。例如 執行緒池,需要管理執行緒的數量 2.提高效率,降低記憶體損耗。例如 db連線池,連線的是...

設計模式複習 單例模式

設計模式 單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問節點。懶漢模式涉及多執行緒上鎖問題,餓漢模式不涉及多執行緒上鎖問題 下面實現懶漢跟餓漢模式,先不考慮上鎖問題,最後補充。設計模式 迭代器模式 iterator 提供一種方法順序訪問乙個聚合物件中的各個元素,而...