作j2ee若是不懂單例模式和線程池慢慢就是白學了。redis
線程池處處都能看到,httpsession,數據庫鏈接池,redis鏈接池,MQ鏈接池。。。spring
使用場景:頻繁使用且建立本消耗高數據庫
多線程環境下,使用場景隨處可見...安全
餓漢式和懶漢式
名詞懶得解釋了。。。
懶漢式須要雙重鎖定
餓漢式沒線程安全問題
1,雙鎖單例模式,懶漢式
session
1 /// 定義一個全局訪問點 2 /// 設置爲靜態方法 3 /// 則在類的外部便無需實例化就能夠調用該方法 4 public static Singleton GetInstance() 5 { 6 //這裏能夠保證只實例化一次 7 //即在第一次調用時實例化 8 //之後調用便不會再實例化 9 //第一重 singleton == null 10 if (singleton == null) 11 { 12 lock (syncObject) 13 { 14 //第二重 singleton == null 15 if (singleton == null) 16 { 17 singleton = new Singleton(); 18 } 19 } 20 } 21 return singleton; 22 } 23 24
2,靜態工廠方法,也是餓漢式最簡單寫法。多線程
1 public class Singleton{ 2 //initailzed during class loading 3 private static final Singleton INSTANCE = new Singleton(); 4 5 //to prevent creating another instance of Singleton 6 private Singleton(){} 7 8 public static Singleton getSingleton(){ 9 return INSTANCE; 10 } 11 }
1 //獲取spring建立的bean對象 2 public synchronized static MyCache getInstance() { 3 4 return ServletUtil.getApplicationContext().getBean( MyCache.class); 5 6 }
3,序列化對象,枚舉實現單例基本是炫技,ide
最後:spa
單核心的多線程,不會有2個線程同時進入if判斷,本質仍是一個線程。但多核心的,就徹底可能2線程同時一個if判斷。操作系統
單例的範圍:線程