單例模式:
如果要保證系統裡乙個類最多只能存在乙個例項時,我們就需要用單例模式。這種情況在我們應用中經常碰到,例如快取池,資料庫連線池,執行緒池,一些應用服務例項等。
最簡單的單例:
public class singleton
}此實現是執行緒安全的,使用也非常簡單:singleton singleton=singleton.getinstance();
延遲建立:
public class untreadsafesingleton
return instance;}}
上述實現不是執行緒安全的,為了達到執行緒安全可以在獲取例項的方法上加上關鍵字synchroniezd
。但是在多執行緒高併發訪問的情況下,給方法加上
synchroniezd
關鍵字會使效能大不如前。我們仔細分析一下不難發現,使用
synchroniezd
關鍵字對整個
getinstance
()方法進行同步是沒有必要的:我們只要保證例項化這個物件的那段**被乙個執行緒執行就可以了,而返回引用的那段**是木有必要同步的。按照這個想法,大致**如下:
public class doublechecksingleton
}return instance;}}
在getinstance()
方法裡,我們首先判斷此例項是否已經被建立,如果還沒有建立,首先使用
synchronized
同步例項化**塊。在同步**塊裡,我們還需要再次檢查是否已經建立了此類的例項,這是因為:如果沒有第二次檢查,這時有兩個執行緒a和
b同時進入該方法,它們都監測到
instance
為null
,不管哪乙個執行緒先佔據同步鎖建立例項,都不會阻止另乙個執行緒繼續進入例項化**重新建立例項物件。
屬性instance
是被volatile
修飾的,因為
volatile
具有synchroniezd
的可見性特點,也就是說執行緒能夠自動發現
volatile
變數的最新值。這樣,如果
instance
例項化成功,其他執行緒便能立即發現。
2011 5 6漫談設計模式(單例模式)
1.最簡單的單例模式 package com.singleton 這是最簡單的單例模式,實現的效果的是在乙個jvm中只有乙個例項 類在載入的時候靜態變數只會初始化一次。1.這種模式的問題在於不能夠延遲載入,當 singleton載入到記憶體的時候 例項就會自動生成,不能夠延遲載入 public cl...
設計模式筆記 單例模式
單例模式在系統開發時很常見,乙個系統中可能會有多個單例模式的運用!它比全域性變數的好處?1.能控制生成時間,保證初始化順序?2.容易保證執行緒安全 全域性變數需要多執行緒client單獨控制併發,單例在類實現中已經做到,無需client再處理 3.減少函式模組之間的耦合,減少命名衝突,便於管理?可能...
設計模式筆記 單例模式
1 懶漢式 1 執行緒不安全 public class singleton public static singleton getinstance return singleton 缺點 不支援多執行緒。2 執行緒安全 public class singleton public static syn...