•
不要作斷開單例類對象與類中靜態引用的危險操做。
•
多線程使用單例使用共享資源時,注意線程安全問題。
關於java中單例模式的一些爭議:
單例模式的對象長時間不用會被jvm垃圾收集器收集嗎單例模式的對象長時間不用會被jvm垃圾收集器收集嗎
看到很多資料中說:若是一個單例對象在內存中長久不用,會被jvm認爲是一個垃圾,在執行垃圾收集的時候會被
清理掉。對此這個說法,筆者持懷疑態度,筆者本人的觀點是:
在hotspot虛擬機1.6版本中,除非人爲地斷開單在hotspot虛擬機1.6版本中,除非人爲地斷開單
例中靜態引用到單例對象的聯接,不然jvm垃圾收集器是不會回收單例對象的。例中靜態引用到單例對象的聯接,不然jvm垃圾收集器是不會回收單例對象的。
對於這個爭議,筆者單獨寫了一篇文章進行討論,若是您有不一樣的觀點或者有過這方面的經歷請進入文章
單例模
式討論篇:單例模式與垃圾收集
參與討論。
在一個jvm中會出現多個單例嗎在一個jvm中會出現多個單例嗎
在分佈式系統、多個類加載器、以及序列化的的狀況下,會產生多個單例,這一點是無庸置疑的。那麼在同一個j
vm中,會不會產生單例呢?使用單例提供的getInstance()方法只能獲得同一個單例,除非是使用反射方式,將
會獲得新的單例。代碼以下
Class c = Class.forName(Singleton.class.getName());
Constructor ct = c.getDeclaredConstructor();
ct.setAccessible(true);
Singleton singleton = (Singleton)ct.newInstance();
這樣,每次運行都會產生新的單例對象。因此運用單例模式時,必定注意不要使用反射產生新的單例對象。
懶漢式單例線程安全嗎
主要是網上的一些說法,懶漢式的單例模式是線程不安全的,即便是在實例化對象的方法上加
synchronizedsynchronized
關鍵字,也依然是危險的,可是筆者通過編碼測試,發現加
synchronizedsynchronized
關鍵字修飾後,雖然對性能有部分影響,可是倒是線程安全的,並不會產生實例化多個對象的狀況。
單例模式只有懶漢模式和餓漢模式嗎?
餓漢式單例和懶漢式單例只是兩種比較主流和經常使用的單例模式方法,從理論上講,任何能夠實現一個類只有一個
實例的設計模式,均可以稱爲單例模式。
單例類能夠被繼承嘛
餓漢式單例和懶漢式單例因爲構造方法是private的,因此他們都是不可繼承的,可是其餘不少單例模式是能夠繼
承的,例如登記式單例。
餓漢單例好仍是懶漢單例好呢?
在java中,餓漢式單例要優於懶漢式單例。C++中則通常使用懶漢式單例。
單例模式比較簡單,在此就不舉例代碼演示了。