摘要:懶漢式單例模式單例類測試類輸出實現方式構造方法私有化。存在問題線程不安全,如果多個線程同時訪問,仍會產生多個實例對象。
一般實現
創建執行方法
public class WithoutSingleton { public static void withoutSingletonInfo(WithoutSingleton withoutSingleton){ System.out.println("WithoutSingleton.hashCode = " + withoutSingleton.hashCode()); } }
測試類
public static void main(String[] args) { WithoutSingleton withoutSingleton = new WithoutSingleton(); WithoutSingleton.withoutSingletonInfo(withoutSingleton); WithoutSingleton withoutSingleton2 = new WithoutSingleton(); WithoutSingleton.withoutSingletonInfo(withoutSingleton2); WithoutSingleton withoutSingleton3 = new WithoutSingleton(); WithoutSingleton.withoutSingletonInfo(withoutSingleton3); }
輸出
WithoutSingleton.hashCode = 2083479002 WithoutSingleton.hashCode = 163238632 WithoutSingleton.hashCode = 1215070805
問題
每次生成的類的實例對象都是不同的,但是在一些特定的場合,需要每次返回的實例對象都是同一個,如:sping中創建bean。
懶漢式單例模式
單例類
public class LazySingleton { private static LazySingleton lazySingleton = null; private LazySingleton(){ } public static LazySingleton getInstance(){ if(lazySingleton == null){ lazySingleton = new LazySingleton(); } return lazySingleton; } public static void singletonInfo(){ System.out.println("lazySingleton.hashCode = " + lazySingleton.hashCode()); } }
測試類:
public static void main(String[] args) { LazySingleton lazySingleton = LazySingleton.getInstance(); lazySingleton.singletonInfo(); LazySingleton lazySingleton2 = LazySingleton.getInstance(); lazySingleton2.singletonInfo(); LazySingleton lazySingleton3 = LazySingleton.getInstance(); lazySingleton3.singletonInfo(); }
輸出:
lazySingleton.hashCode = 1110594262 lazySingleton.hashCode = 1110594262 lazySingleton.hashCode = 1110594262
實現方式
構造方法私有化。
存在問題
線程不安全,如果多個線程同時訪問,仍會產生多個實例對象。
解決方法
1.在getInstance()方法上同步synchronized(同步對性能有影響)
2.雙重檢查鎖定
3.靜態內部類
餓漢式單例模式
代碼實現
public class HungrySingleton { private static HungrySingleton hungrySingleton = new HungrySingleton(); private HungrySingleton(){ } public static HungrySingleton getInstance(){ return hungrySingleton; } public static void singletonInfo(){ System.out.println("hungrySingleton.hashCode = " + hungrySingleton.hashCode()); } }
輸出
hungrySingleton.hashCode = 1977385357 hungrySingleton.hashCode = 1977385357 hungrySingleton.hashCode = 1977385357
說明
靜態成員變量在類加載的時候就會創建實例對象,解決了線程不安全問題
缺點
類加載時就創建實例對象,會占用系統內存,如果存在大量單例類(一般不會出現),或者創建的類并沒有使用,會造成內存浪費。
源碼
https://github.com/Seasons20/DisignPattern.git
END
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69245.html
摘要:如果需要防范這種攻擊,請修改構造函數,使其在被要求創建第二個實例時拋出異常。單例模式與單一職責原則有沖突。源碼地址參考文獻設計模式之禪 定義 單例模式是一個比較簡單的模式,其定義如下: 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 或者 Ensure a class has only one instance, and provide a global point of ac...
摘要:在設計模式一書中,將單例模式稱作單件模式。通過關鍵字,來保證不會同時有兩個線程進入該方法的實例對象改善多線程問題為了符合大多數程序,很明顯地,我們需要確保單例模式能在多線程的情況下正常工作。 在《Head First 設計模式》一書中,將單例模式稱作單件模式。這里為了適應大環境,把它稱之為大家更熟悉的單例模式。 一、了解單例模式 1.1 什么是單例模式 單例模式確保一個類只有一個實例,...
摘要:總結單例是運用頻率很高的模式,因為客戶端沒有高并發的情況,選擇哪種方式并不會有太大的影響,出于效率考慮,推薦使用和靜態內部類實現單例模式。 單例模式介紹 單例模式是應用最廣的模式之一,也可能是很多人唯一會使用的設計模式。在應用單例模式時,單例對象的類必須保證只用一個實例存在。許多時候整個系統只需要一個全局對象,這樣有利于我么能協調整個系統整體的行為。 單例模式的使用場景 確保某個類有且...
摘要:雙重檢查鎖單例模式懶漢單例模式中,我們并不需要整個方法都是同步的,我們只需要確保再創建的時候,進行同步即可。單例模式的缺點優點在開頭已經說明了,單例模式的缺點在于它一般沒有接口,擴展困難,基本上修改源代碼是擴展單例模式的唯一方法。 單例模式 定義: 確保某一個類只有一個實例對象,并且該對象是自行實例化的,通過統一的接口向整個系統提供這個實例對象。 使用場景: 避免產生多個對象消耗過多的...
閱讀 1211·2023-04-25 20:31
閱讀 3718·2021-10-14 09:42
閱讀 1485·2021-09-22 16:06
閱讀 2636·2021-09-10 10:50
閱讀 3524·2021-09-07 10:19
閱讀 1772·2019-08-30 15:53
閱讀 1170·2019-08-29 15:13
閱讀 2818·2019-08-29 13:20