單例模式(四)
由前三篇的分析,我們該怎麼實現既能達到餓漢式中不用繁瑣的線程控制進而影響系統性能的方式實現單例模式,又能達到懶漢式的延遲加載的效果呢?實現該效果要用到被稱爲IoDH的技術。不多說,直接上代碼:
public class IoDHSingle {
private IoDHSingle() {
// TODO Auto-generated constructor stub
}
private static class HolderClass{
private final static IoDHSingle instance=new IoDHSingle();
}
public static IoDHSingle getInstance() {
return HolderClass.instance;
}
}
爲什麼以上代碼可以實現想要的效果呢?關鍵在增加了一個靜態內部類。
1)代碼中沒有繁瑣的線程控制代碼,我們可以達到餓漢式的效果;
2)靜態變量不是IoDHSingle的成員變量,所以在加載類IoDHSingle時,不會初始化變量,而是在調用getInstance時,虛擬機加載HolderClass類,進而再初始化變量instance,因此,達到了延遲加載的效果;
這時大家會問,那多線程訪問 的時候,是怎麼保證單例的呢?這裏是靠java虛擬機來保證其線程安全性的,這裏也帶來了一個缺點,就是該方法依賴編程語言的特性,不過該方法也算是在java中實現單例模式的最佳方式了。
通過以上的分析,我們再一次體會到,程序真的沒有最好,只有更好。
那單例模式在聲明情況下使用呢?先想想,看單例模式最後一篇的總結吧---單例模式(五)