前面介紹的懶漢式單例模式使用方法,在單執行緒的程式應用中是沒有任何問題的,但是在多執行緒的程式中就會出現問題,當多個執行緒都進行if(instance == null)判斷時,就會產生多個類的例項,這就違反了單例模式的原則,也不符合程式的需要,怎麼辦呢?對於多執行緒下的應用,可以增加synchronized()同步機制,示意**如下:
public
class singleton
//增加同步機制
public
static synchronized singleton getinstance()
return instance;
}}
此時,將synchronized(同步)機制放在了獲取例項的方法上,如果該程式在多個執行緒下執行,將會只產生乙個該類的例項,達到了單例模式的需求,但是因為這種寫法是將synchronized(同步)機制放在了獲取例項的方法上,導致程式每獲取一次例項,都將進入synchronized(同步)機制,如果在程式執行時,需要大量的獲取該類的例項,這種方法將時非常低效的。還有另外一種寫法,將synchronized(同步)機制放在產生例項的**前。示意**如下所示:
public
class singleton
public
static singleton getinstance()}}
}
這種寫法避免了每次獲取例項時,都進入sunchronized(同步機制),但是和最初的寫法一樣,採用這種寫法則避免不了在多執行緒時,返回多個例項的問題,為此產生了新的寫法double-checked locking(雙檢測鎖)機制,示意**如下:
public
class singleton
public static singleton getinance()
}
return instance;
}}
這種方式下,只有第一次建立例項時,才進入synchronized(同步)機制,以後因為例項已經建立,將不會再進入synchronized同步機制。因此這種做法,滿足了在多執行緒條件下單例模式的應用,其實最簡單的做法,還是最開始的那種,直接new乙個該類的例項,示意**如下:
public
class singleton
public
static singleton getinstance()
}
單例模式(一)static final和單例模式
那天我朋友問了我個問題,static和單例模式有什麼區別,所以我覺得static可以講一下 他的問題是,把物件弄成static是不是就不變了 顯然,這是還沒弄清楚引用和物件的區別 其實存放在靜態區中的是引用,而不是物件。而物件是存放在堆中的。如果有這樣一句話 public static final ...
繼承單例模式 php PHP設計模式之單例模式
單例模式,就是保持乙個物件只存在乙個例項。並且為該唯一例項提供乙個全域性的訪問點 一般是乙個靜態的getinstance方法 單例模式應用場景非常廣泛,例如 資料庫操作物件 日誌寫入物件 全域性配置解析物件 這些場景的共同特徵是從業務邏輯上來看執行期間改物件卻是只有乙個例項 不斷new多個例項會增加...
雙重檢測單例模式
在多執行緒場景下,當乙個執行緒判斷instance為null時 他會新建乙個例項,那麼問題來了,當a執行緒發現物件例項為空時,準備 新建乙個例項,這時cpu輪詢到b執行緒,b執行緒也察覺物件例項為空,它也會新建乙個例項,這樣就破壞了單例模式。首先物件例項必須是全域性共享的,用volatile修飾,然...