在java中,單例模式算是比較基礎和簡單的,今天就來簡單聊聊什麼是單例模式。比如說,一個應用程式中,某個類的實例對象只有一個,而我們沒有辦法new,因為構造器已經被private聲明了,通過getInstance()的方法可以獲取它們的實例。getInstance()的返回值是一個對象的引用,並不是一個新的實例,這點要注意理解,不要錯誤的認為是多個對象。
代碼例子:
public class Singleton {private static Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) { singleton = new Singleton(); } return singleton;}}
這是最基本的寫法,非常簡單但是線程不安全。其實還有另外幾種寫法:
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
這也是基本的寫法,但是這樣寫的線程是安全的。在這些基礎的寫法之上,偉大的程式設計師們又開發出來幾種別的新花樣,如:
餓漢式寫法:
public class Singleton {
private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }
靜態內部類
public class Singleton {
private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
枚舉
public enum Singleton {
INSTANCE; public void whateverMethod() { } }
這種方式能避免多線程同步問題,還能防止反序列化重新創建新的對象。
雙重校驗鎖
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; } }
對於初學者來說,首先要弄懂最基本的寫法是什麼意思,然後再去嘗試更多的寫法,就一通百通了。有想法的朋友們,歡迎在評論區留言討論,也可以關注我的百家號:IT圈不亂!