Java中常見的單例模式有兩種:懶漢模式和餓漢式。下面分別介紹這兩種單例模式:
懶漢模式
懶漢模式是在需要獲取實例時才會創(chuàng)建對象,因此稱之為“懶漢”,可以延遲對象的產(chǎn)生,但是需要考慮到線程安全的問題。
public class LazySingleton { private static LazySingleton instance; private LazySingleton() {} public static synchronized LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } }
上述代碼中,getInstance()方法中使用了synchronized關(guān)鍵字,使得整個方法變成線程安全的,但是由于每次獲取實例時都需要進行同步操作,會降低程序效率。
餓漢式
餓漢式是在類加載時就會創(chuàng)建對象,因此稱之為“餓漢”,雖然沒有懶漢模式存在的線程安全問題,但是可能會浪費內(nèi)存資源。
public class HungrySingleton { private static HungrySingleton instance = new HungrySingleton(); private HungrySingleton() {} public static HungrySingleton getInstance() { return instance; } }
上述代碼中,static關(guān)鍵字定義的實例會在類加載時就會創(chuàng)建對象,保證了線程安全,但是如果一直沒有用到該單例對象,會造成浪費內(nèi)存資源。