今天打算來複習一下單例模式。單例模式是設計模式裡較為簡單的一種模式,也非常常用,廣泛應用於各種框架當中。所謂單例模式,就是確保乙個類只有乙個例項,並提供全域性訪問點。
單例模式有好幾種形式,其中最簡單的是餓漢式:
class singleton
public
static singleton getinstance()
餓漢式在呼叫例項前已經建立好了物件,比起下面要講到的懶漢式省去了判斷的時間,但由於每次都會例項化物件,浪費一定的空間,所以適用於確定單例物件大多數時候都會被呼叫的程式。
與餓漢式相對應的是懶漢式:
class singleton
public
static singleton getinstance()
return singleton;
}}
懶漢式在每次獲取物件時先判斷是否已經例項化物件,如果沒有的話再去建立物件。所以,如果在程式的整個生命週期如果沒有試圖獲取物件的話,該單例物件是不會被建立的,省去了空間,但多了一些判斷的時間。
上面提到的懶漢式其實並不完善,但出現兩個或以上的執行緒要呼叫該單例物件的時候,就有可能會發生問題。下面我們來分析一下:
假設現在我們的程式現在有執行緒a,b兩個執行緒在執行,一開始物件還沒被建立,singleton==null為真,a執行緒進入if語句塊之後,在物件建立之前 ,b執行緒也通過判斷進入if語句塊,接下來問題就發生了,兩個執行緒建立了兩個物件!為了防止這種現象發生,我們需要進行如下改進:
class singleton
public
static
synchronized singleton getinstance()
return singleton;
}}
這樣就避免了多執行緒問題,但無疑同步會大大地降低了效能。更好的方法是使用「雙重檢查加鎖」:
class singleton
public
static singleton getinstance()}}
return singleton;
}}
設計模式之單例模式
前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...
設計模式之單例模式
package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...
設計模式之 單例模式
單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...