6 單例模式與線程池

作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  
View Code

 

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 }
View Code

 

 

spring配置的sessionFactory \DataSource都是默認單例。例如:

 

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判斷。操作系統

單例的範圍:線程

本文的單例的範圍是AppDomain. 
要在一個AppDomain中保持單例的辦法是, 只在Main()中new這個對象一次, 而後把這個對象的引用賦值給所用使用它的對象.

若是要在操做系統中實現單例, 就須要使用Mutex(對象互斥鎖)了。一個程序只容許運行一個實例,即不能多開。在我寫C#桌面程序時常常用到。
若是要在Internet上實現單例, 能夠使用URL惟一.
相關文章
相關標籤/搜索