單例模式《漫談設計模式》閱讀筆記

2022-07-13 23:45:26 字數 1093 閱讀 5531

單例模式:

如果要保證系統裡乙個類最多只能存在乙個例項時,我們就需要用單例模式。這種情況在我們應用中經常碰到,例如快取池,資料庫連線池,執行緒池,一些應用服務例項等。

最簡單的單例:

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...