采用單例模式創建的類,無論程序如何運行,只會有一個實例會對象產生。2、如何實現單例模式
把握三個原則:(1)構造方法私有化。(2)類內部需自己實例化對象。(3)提供公有的方法返回該實例化對象。外部想要拿到該類的實例化對象則必須通過該公有方法的返回(實際上,java可以通過反射機制是能夠實例化構造方法是私有化的類的,這會導致所有模式的單例模式失效,這里暫不做討論)。(1)餓漢模式
//餓漢式單例類.在類初始化時,已經自行實例化 public class Singleton1 { PRivate Singleton1() {} private static final Singleton1 single = new Singleton1(); //靜態工廠方法 public static Singleton1 getInstance() { return single; } } 餓漢模式,即在類創建的同時就把該類實例化了,這可能會導致資源浪費,因為有可能不會用到該類的實例化對象,但是該模式是線程安全的。(2)懶漢模式
//懶漢式單例類.在第一次調用的時候實例化自己 public class Singleton { private Singleton() {} private static Singleton single=null; //靜態工廠方法 public static Singleton getInstance() { if (single == null) { single = new Singleton(); } return single; } } 懶漢模式,是在第一次調用返回實例化對象的公有方法的時候才會去創建,但這不是線程安全的,因為有可能兩個線程同時調用該方法。可以在方法上加鎖(synchronized):
public static synchronized Singleton getInstance() { if (single == null) { single = new Singleton(); } return single; } 或者:public static Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } 只在實例化對象為空時才會進入同步,效率稍微比在方法外面加同步修飾高一點。但是這樣同樣會造成一定資源的浪費,因為大多數情況下并不會出現線程安全問題。
新聞熱點
疑難解答