總結下Java單例模式的幾種寫法:
1. 餓漢式
public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }
優點:實現簡單,不存在多線程問題,直接聲明一個私有對象,然后對外提供一個獲取對象的方法。
缺點:class 類在被加載的時候創建Singleton實例,如果對象創建后一直沒有使用,則會浪費很大的內存空間,此方法不適合創建大對象。
2. 懶漢式(線程不安全)
public class Singleton { private static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
優點:節省內存空間,在使用的時候才會創建;
缺點:在多線程下,可能會創建多個實例(一定要重視這個問題,有時候如果在單例對象的構造方法中做了某些重要操作,創建多個實例可能會造成可怕后果,如:打開Android的Sqlite數據庫連接)。
3. 懶漢式(線程安全)
public class Singleton { private static Singleton instance = null; private Singleton() {} public synchronized static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
優點:支持多線程,且以懶漢式的方式加載,不浪費內存空間。
缺點:將 synchronized 塊加在方法上,會影響並發量,每次調用getInstance()方法都會線程同步,效率十分低下。最重要的是,當創建好實例對象之后,就不必繼續進行同步了。
4.懶漢式(線程安全,推薦)
public class Singleton { private static volatile Singleton instance = null; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
優點:支持多線程,並發量高,且以懶漢式加載,不浪費內存空間。
缺點:一時找不出缺點,非要說缺點的話,就是實現比較麻煩。