注意:
-
1、單例類只能有一個實例。
-
2、單例類必須自己創建自己的唯一實例。
-
3、單例類必須給所有其他對象提供這一實例。
一,餓漢式
線程安全,調用效率高,但不能延時加載
實例:
public class ImageLoader{ //自己創建自己的唯一實例對象 private static ImageLoader instance = new ImageLoader; //構造函數爲private,這樣該類就不會被實例化 private ImageLoader(){} //獲取唯一可用對象 public static ImageLoader getInstance(){ return instance; } //其他方法 ... }
二,懶漢式
線程安全,調用效率不高,但是能延時加載
線程不安全
實例:
public class Singleton{ private static Singleton instance; private Singleton(){} public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } }
這種方式具備很好的 lazy loading,能夠在多線程中很好的工作,但是,效率很低,99% 情況下不需要同步。 優點:第一次調用才初始化,避免內存浪費。 缺點:必須加鎖 synchronized 才能保證單例,但加鎖會影響效率。 getInstance() 的性能對應用程序不是很關鍵(該方法使用不太頻繁)。
實例:
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
這種方式採用雙鎖機制,安全且在多線程情況下能保持高性能。 getInstance() 的性能對應用程序很關鍵。
實例:
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
線程安全,調用效率高,可以延時加載
public class SingletonDemo3 { private static class SingletonClassInstance{ private static final SingletonDemo3 instance=new SingletonDemo3(); } private SingletonDemo3(){} public static SingletonDemo3 getInstance(){ return SingletonClassInstance.instance; } }
public enum SingletonDemo4 { //枚舉元素本身就是單例 INSTANCE; //添加自己需要的操作 public void singletonOperation(){ } }