單例模式定義
它是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為,他的作用是確保某個類只有乙個例項,避免產生多個物件消耗過多的資源
為什麼要用單例模式?
1、單例模式節省公共資源
比如:大家都要喝水,但是沒必要每人家裡都打一口井是吧,通常的做法是整個村里打乙個井就夠了,大家都從這個井裡面打水喝。
對應到我們計算機裡面,像日誌管理、印表機、資料庫連線池、應用配置。
2、單例模式方便控制
就像日誌管理,如果多個人同時來寫日誌,你一筆我一筆那整個日誌檔案都亂七八糟,如果想要控制日誌的正確性,那麼必須要對關鍵的**進行上鎖,只能乙個乙個按照順序來寫,而單例模式只有乙個人來向日誌裡寫入資訊方便控制,避免了這種多人干擾的問題出現。
單例模式優缺點
優點:系統記憶體中該類只存在乙個物件,節省了系統資源,對於一些需要頻繁建立銷毀的物件,使用單例模式可以提高系統效能。
缺點:可讀性差,當想例項化乙個單例類的時候,必須要記住使用相應的獲取物件的方法,而不是使用 new,可能會給其他開發人員造成困擾,特別是看不到原始碼的時候。單例模式中在使用反射時,物件也可能不唯一,所以我們要注意不要認定單例模式唯一是其好處,從而生成刻板印象
單例模式的實現步驟:
(1)將構造方法私有化,使其不能在類的外部通過new關鍵字例項化該類物件。
(2)在該類內部產生乙個唯一的例項化物件,並且將其封裝為private static型別。
(3)定義乙個靜態方法返回這個唯一物件。
注意事項:
單例模式在多執行緒的應用場合下必須小心使用。如果當唯一例項尚未建立時,有兩個執行緒同時呼叫建立方法,那麼它們同時沒有檢測到唯一例項的存在,從而同時各自建立了乙個例項,這樣就有兩個例項被構造出來,從而違反了單例模式中例項唯一的原則。 解決這個問題的辦法是為指示類是否已經例項化的變數提供乙個互斥鎖(雖然這樣會降低效率)。
單例模式的實現方式有兩種:1.餓漢模式 2.懶漢模式
1.餓漢模式
/**
* 單例模式——餓漢模式
*/public
class
threaddemo14
//設定乙個私有屬性,其實就是它的例項
private
static singleton instance =
newsingleton()
;//提供統一的獲取例項的方法
public
static singleton getsingleton()
}public
static
void
main
(string[
] args)
}
**分析:
餓漢式顧名思義,就是這個漢子很餓,一上來就把單例物件建立出來了,要用的時候直接返回即可,這種是單例模式中最簡單的一種實現方式。但是問題也比較明顯。單例在還沒有使用到的時候,初始化就已經完成了。如果程式從頭到位都沒用使用這個單例的話,單例的物件還是會建立,這就造成了不必要的資源浪費。
2.懶漢模式(執行緒不安全)[不可用]
/**
* 單例模式——懶漢模式
*/public
class
threaddemo15
//設定乙個私有屬性,並且不會對它進行賦值
private
static singleton instance = null;
public
static singleton getinstance()
return instance;}}
public
static
void
main
(string[
] args)
}
優點:如果真實使用的情況下才會建立資源,如果沒人呼叫就可以省略建立的物件的步驟了
注意:
這種寫法起到了懶載入的效果,但只能在單執行緒下使用。如果在多執行緒下,乙個執行緒進入了 if (instance == null) 判斷語句塊,還未來得及往下執行,另乙個執行緒也通過了這個判斷語句,這時便會產生多個例項。所以在多執行緒環境下不可使用這種方式。
而這裡面我們從原子性的角度去分析
1.餓漢模式
2.懶漢模式
2.1.懶漢模式(執行緒安全,但是不推薦使用)
2.2.懶漢模式(同步**塊,執行緒安全,但是不可用)
但是這種同步並不能起到執行緒同步的作用。假如乙個執行緒進入了 if (instance == null) 判斷語句塊,還未來得及往下執行,另乙個執行緒也通過了這個判斷語句,這時便會產生多個例項。
2.3.懶漢模式雙重校驗鎖
雙檢索模式,進行了兩次判斷,第一次判斷時為了避免不要的例項,第二次是為了進行執行緒同步,避免多執行緒問題。
由於 new singleton()建立物件的時候jvm中可能會重新排序,在多執行緒下存在風險,使用volatile關鍵字可以當執行緒改變其值後通知其他執行緒改變並且不會被jvm重新排序,解決該問題。
static
class
singleton
private
static
volatile singleton instance = null;
public
static singleton getinstance()
}}return instance;
}}
這種方式跟餓漢式方式都是採用了類裝載的機制來保證初始化例項時只有乙個執行緒,不同的地方在餓漢式方式是只要 singleton 類被裝載就會例項化,沒有懶載入的作用,而靜態內部類方式在 singleton 類被裝載時並不會立即例項化,而是在需要例項化時,呼叫 getinstance 方法,才會裝singletoninstance 類,從而完成 singleton 的例項化。這種方法,避免了執行緒不安全,延遲載入,效率高。
類的靜態屬性只會在第一次載入類的時候初始化,所以在這裡,jvm 幫助我們保證了執行緒的安全性,在類進行初始化時,別的執行緒是無法進入的。
c 多執行緒單例模式 執行緒安全C 單例模式
我對此處記錄的單例模式有一些疑問 http us library ff650316.aspx 以下 摘自該文章 using system public sealed class singleton private static volatile singleton instance private ...
單例模式,執行緒池
1 使用單例模式建立執行緒池的原因 因為在乙個程式中往往都只會使用乙個執行緒池,所以為了 更加的完善,我們可以使用單例模式來建立執行緒池。參考部落格 開發過程中會使用到多執行緒,我們需要對執行緒進行有效地管理,此時,我們會在不同的模組中自己手動地建立乙個執行緒池,然後再使用,但是這並不利於同於對執行...
多執行緒 單例模式
單例模式 是非常典型常用的一種設計模式 乙份資源只能被申 載一次 單例模式的方法建立的類在當前程序中只有乙個例項 資源的程式初始化的時候就去載入,後面使用的時候直接使用,使用的時候比較流暢,有可能會載入用不上的資源,導致程式初始化時間比較慢。include class single instance...