單例模式 層層剖析尋找最高效安全的單例

2021-08-29 09:36:32 字數 2662 閱讀 5357

什麼是單例?它的運用場景是什麼?

單例模式是指保證在系統中只存在某類唯一物件。運用場景隨處可見,例如工具類、spring容器預設new物件等。

單例模式有幾種實現方式?

餓漢式、懶漢式、雙重檢查鎖式、內部類式、列舉式。

推薦使用方式?

餓漢式、內部類式。

餓漢式顧名思義餓,那麼當應用程式一開始類載入,類的物件立馬例項化載入至jvm。

/**

* 優點:呼叫效率高。

* 缺點:沒有延遲載入。

*/public class singletonclass

}public class singleton

private singleton() {}

public static singleton getinstance()

}

為什麼呼叫效率高?沒有延遲載入?

答:假設在高併發的場景下,有10w+併發呼叫,不需要同步處理。可以直接在堆記憶體直接獲取物件不需要任何等待。

同樣,它沒有延遲載入,如果它是需要消耗很大記憶體的物件,最開始就加載入堆記憶體,而使用者暫時不需要。這樣就會嚴重占用堆記憶體,影響執行效率。

導引:腦洞大開的程式設計師們說:上述問題還不簡單,當呼叫的時候在new物件不就行。於是出現了懶漢式的雛形版本。

public class singletonclass 

return instance;}}

懶漢式顧名思義懶,就是延遲載入,當被呼叫的時候再例項化。

問題:如果你是初出茅廬的應屆生寫成這樣,估計面試官也不會追究什麼。如果你是有一年工作年限的程式設計師,估計面試官就會聲討你了。假設,併發數10w+,它就將被蹂躪的不堪入目。那麼我們需要怎麼解決呢?加上同步操作就大功告成。

public class singletonclass 

return instance;}}

問題:從效率維度考慮,估計這樣已經完美了吧?但是,從安全緯度考慮,依然隱隱約約存在問題。如果是接觸過反射、反序列化的同學,我們一起來繼續**。

/**

* 通過反射破壞懶漢式單例

問題:這麼輕易就被破解了?那怎麼解決呢?

public class singletonclass implements serializable

}public static synchronized singletonclass getinstance()

return instance;

}//當沒有定義這方法時,反序列化預設是重新new物件。

//反序列化時,如果定義了readresolve()則直接返回此方法指定的物件。而不需要單獨再建立新物件!

private object readresolve() throws objectstreamexception

}

雙重檢查鎖與內部類的方式:緣由懶漢式、餓漢式要麼存在呼叫效率低或者執行效率低問題。而這兩種方式取前兩者的優點為自己所用。

/**

* 單例模式-雙重檢查鎖 執行緒安全

* @author aaron

*/public class singletonclass}}

return instance;}}

/**

* 單例模式-靜態內部類的方式

* @author aaron

*/public class singletonclass

public static singletonclass getinstance()

}

/**

* 單例模式-列舉的方式

* @author aaron

*/public enum singletonclass

系統記憶體中該類只存在乙個物件,節省了系統資源,對於一些需要頻繁建立銷毀的物件,使用單例模式可以提高系統效能。

當想例項化乙個單例類的時候,必須要記住使用相應的獲取物件的方法,而不是使用new,可能會給其他開發人員造成困擾,特別是看不到原始碼的時候。

集群環境中的單例設計模式

在乙個多元 jvm 環境中,每個 jvm 擁有自己對於該單例物件的拷貝,這將導致很多問題,尤其是在對於資源的訪問需要受限和加鎖的集群的環境中。

為了實現跨 jvm 集群,可以使用很多技術(jms、db、自定義 api、第三方工具),但這些技術都將影響到系統業務邏輯。

單例模式 層層剖析尋找最高效安全的單例

什麼是單例?它的運用場景是什麼?單例模式是指保證在系統中只存在某類唯一物件。運用場景隨處可見,例如工具類 spring容器預設new物件等。單例模式有幾種實現方式?餓漢式 懶漢式 雙重檢查鎖式 內部類式 列舉式。推薦使用方式?餓漢式 內部類式。餓漢式顧名思義餓,那麼當應用程式一開始類載入,類的物件立...

單例模式 層層剖析尋找最高效安全的單例

什麼是單例?它的運用場景是什麼?單例模式是指保證在系統中只存在某類唯一物件。運用場景隨處可見,例如工具類 spring容器預設new物件等。單例模式有幾種實現方式?餓漢式 懶漢式 雙重檢查鎖式 內部類式 列舉式。推薦使用方式?餓漢式 內部類式。餓漢式顧名思義餓,那麼當應用程式一開始類載入,類的物件立...

安全高效的單例

概述 單例設計模式,就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法 靜態方法 單例適用於需要頻繁的進行建立和銷毀的物件 建立物件時耗時過多或耗費資源過多 即 重量級物件 但又經常用到的物件 工具類物件 頻繁訪問資料庫或檔案的物件 比如資...