當第一次載入Singleton類時不會初始化sInstance,只有在第一次調用Singleton的getInstance方法時才會導致sInstance被初始化。因此第一次調用getInstance方法會導致 虛擬機載入SingletonHolder類,這種方法不僅能夠確保線程安全,也能夠保證單例 ...
當第一次載入Singleton類時不會初始化sInstance,只有在第一次調用Singleton的getInstance方法時才會導致sInstance被初始化。因此第一次調用getInstance方法會導致
虛擬機載入SingletonHolder類,這種方法不僅能夠確保線程安全,也能夠保證單例對象的唯一性,同時也延遲的單例的實例化,所以這是推薦使用的單例模式方式
public class Singleton { private Singleton(){}; public static Singleton getInstance(){ return SingletonHolder.sInstance; } /** * 靜態內部類 */ private static class SingletonHolder{ private static final Singleton sInstance = new Singleton(); } }
這個方法雖然好像也很不錯,但是好像會出現什麼雙重檢查鎖定(DCL)失效。
public class MyImageLoader extends ImageLoader { private static MyImageLoader instance; public static MyImageLoader getInstance() { if (instance == null) { synchronized (MyImageLoader.class) { if (instance == null) { instance = new MyImageLoader(); } } } return instance; } protected MyImageLoader() { } }