什麼是單例?它的運用場景是什麼?
單例模式是指保證在系統中只存在某類唯一物件。運用場景隨處可見,例如工具類、spring容器預設new物件等。
單例模式有幾種實現方式?
餓漢式、懶漢式、雙重檢查鎖式、內部類式、列舉式。
推薦使用方式?
餓漢式、內部類式。
餓漢式顧名思義餓,那麼當應用程式一開始類載入,類的物件立馬例項化載入至jvm。
1為什麼呼叫效率高?沒有延遲載入?public
class
singletonclass
11 }
答:假設在高併發的場景下,有10w+併發呼叫,不需要同步處理。可以直接在堆記憶體直接獲取物件不需要任何等待。
同樣,它沒有延遲載入,如果它是需要消耗很大記憶體的物件,最開始就加載入堆記憶體,而使用者暫時不需要。這樣就會嚴重占用堆記憶體,影響執行效率。
導引:腦洞大開的程式設計師們說:上述問題還不簡單,當呼叫的時候在new物件不就行。於是出現了懶漢式的雛形版本。
public懶漢式顧名思義懶,就是延遲載入,當被呼叫的時候再例項化。class
singletonclass
return
instance;}}
問題:如果你是初出茅廬的應屆生寫成這樣,估計面試官也不會追究什麼。如果你是有一年工作年限的程式設計師,估計面試官就會聲討你了。假設,併發數10w+,它就將被蹂躪的不堪入目。那麼我們需要怎麼解決呢?加上同步操作就大功告成。
1問題:從效率維度考慮,估計這樣已經完美了吧?但是,從安全緯度考慮,依然隱隱約約存在問題。如果是接觸過反射、反序列化的同學,我們一起來繼續**。public
class
singletonclass
10return
instance;11}
12 }
/*** 通過反射破壞懶漢式單例
問題:這麼輕易就被破解了?那怎麼解決呢?
public雙重檢查鎖與內部類的方式:緣由懶漢式、餓漢式要麼存在呼叫效率低或者執行效率低問題。而這兩種方式取前兩者的優點為自己所用。class singletonclass implements
serializable
}public
static
synchronized
singletonclass getinstance()
return
instance;
}//當沒有定義這方法時,反序列化預設是重新new物件。
//反序列化時,如果定義了readresolve()則直接返回此方法指定的物件。而不需要單獨再建立新物件!
private object readresolve() throws
objectstreamexception
}
1問題:緣由jvm對於此種方式的同步控制,並不穩定,當高併發的時候,可能會出現問題,並不推薦使用這種方式。理論上來說,它是不存在問題的。/**2
* 單例模式-雙重檢查鎖3*
@author
aaron4*/
5public
class
singletonclass14}
15}16return
instance;17}
18 }
1/**2
* 單例模式-內部類的方式3*
@author
aaron4*/
5public
class
singletonclass
1011
public
static
singletonclass getinstance()
14 }
1出處:/**2
* 單例模式-列舉的方式3*
@author
aaron4*/
5public
enum
singletonclass
您的支援是對博主深入思考總結的最大鼓勵。
posted @
2017-05-29 12:52
邱勇aries 閱讀(
...)
編輯收藏
單例模式 層層剖析尋找最高效安全的單例
什麼是單例?它的運用場景是什麼?單例模式是指保證在系統中只存在某類唯一物件。運用場景隨處可見,例如工具類 spring容器預設new物件等。單例模式有幾種實現方式?餓漢式 懶漢式 雙重檢查鎖式 內部類式 列舉式。推薦使用方式?餓漢式 內部類式。餓漢式顧名思義餓,那麼當應用程式一開始類載入,類的物件立...
單例模式 層層剖析尋找最高效安全的單例
什麼是單例?它的運用場景是什麼?單例模式是指保證在系統中只存在某類唯一物件。運用場景隨處可見,例如工具類 spring容器預設new物件等。單例模式有幾種實現方式?餓漢式 懶漢式 雙重檢查鎖式 內部類式 列舉式。推薦使用方式?餓漢式 內部類式。餓漢式顧名思義餓,那麼當應用程式一開始類載入,類的物件立...
安全高效的單例
概述 單例設計模式,就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法 靜態方法 單例適用於需要頻繁的進行建立和銷毀的物件 建立物件時耗時過多或耗費資源過多 即 重量級物件 但又經常用到的物件 工具類物件 頻繁訪問資料庫或檔案的物件 比如資...