最詳細的單例模式

2021-10-09 05:38:09 字數 1790 閱讀 6779

單例模式:在整個專案中,只產生乙個例項化物件,這類主要由資料庫連線池等,對於這類物件,一定要小心使用, 因為一般而言單例物件在整個專案中存活很久。有甚者貫穿了這個專案生命週期。定義全域性的集合的時候,一定要小心集合內的元素,有可能儲存在集合的物件在程式中沒有作用,但在集合內存在強引用而造成記憶體洩漏。

下面就來介紹幾種單例模式的寫法。

/**

* 餓漢式:在類載入期間就完成單例物件的繫結。由於在類載入期間是執行緒安全的,所以餓漢式是不會發生執行緒安全問題的。

*/class sigletonobject

public static sigletonobject getinstance()

}

再不是併發場景下,懶漢式

class sigletonobject

public static sigletonobject getinstance()

return sigletonobject;

}}

但是上面這段**在多執行緒環境下,就可能產生多個物件,這對於單例模式是不可忍受的。

class sigletonobject

public static synchronized sigletonobject getinstance()

return sigletonobject;

}}

這段**雖然是執行緒安全,但即使物件已經建立成功,獲取該物件都要獲取鎖,這是不能忍的的。

class sigletonobject 

public static sigletonobject getinstance()

}} return sigletonobject;

}}

雙重鎖判斷,不管你的併發度多高,他都能滿足要求,但是同樣,他是有可能暴露出還沒初始化完成的物件,這是不能忍的。

而造成這個問題的是一般在物件生成的中,首先是分配位址,初始化物件,這是沒問題的,但是把初始化的物件位址賦給sigletonobject和初始化物件存在指令重排序問題,這就會造成把沒有初始化物件給sigletonobject,這就會造成問題。

class sigletonobject 

public static sigletonobject getinstance()

}} return sigletonobject;

}}

這段**就完美了。

class sigletonobject

static class inner

public static sigletonobject getinstance()

}

在載入sigletonobject類時,不會載入其內部類,只有呼叫inner.sigletonobject才會真正載入內部類,這就可以滿足懶載入,這也是作者推薦使用的。但是他也有不適合的場景,雖然我們私有化了他們的建構函式,但是如果是通過反射獲取物件的話,這就會造成產生多個物件,所以如果專案需要通過反射獲取單例物件,就不適用了。

class sigletonobject

private enum sigletonenum

public sigletonobject getinstance()

} public static sigletonobject getinstance()

}

如果說有一種讓作者都心服口服的,那就是列舉實現單例模式,雖然列舉現在很少使用,但確實是好。

單例模式(詳細)

b站學習做的筆記 單例模式就是採取一定的方法保證整個軟體 統裡面對於某個類只能存在乙個例項 並且該類只提供乙個取物件例項的方法 靜態方法 餓漢式 靜態常量 餓漢式 靜態 塊 懶漢式 執行緒不安全 懶漢式 執行緒安全 同步方法 雙重檢查 靜態內部類 列舉 餓漢式的兩種寫法 1靜態常量 步驟 1.構造器...

最普通的單例模式

最近閒來無事,回憶了最簡單的單例模式。經過了乙個小時的嘗試加修改,終於寫好了。下面分享一下我犯傻的地方 ps 這次的單例模式不涉及加鎖之類,只是最基本的單例模式 廢話不多說,先上 includeusing namespace std class singleton private singleton...

最簡單的單例模式

1.啥是單例模式?答 單例模式就是乙個類只有乙個例項 2.為啥不用全域性變數來實現呢?答 因為單例模式既能有全域性變數的優點,可以全域性訪問,但是沒有全域性變數的缺點 3.啥缺點?答 如果我們要在乙個全域性指令碼中放乙個物件,那麼我們要在程式執行前就建立好,如果是開發遊戲,我們要在遊戲執行前建立好這...