iQOO Neo5S 將於 12 月 20 日釋出: 雙芯再進化
阿新 • • 發佈:2021-12-15
簡單點來說,就是一個應用程式中,某個類的例項物件只有一個,你沒有辦法去new,因為構造器所示被private修飾的,一般通過getInstance()的方法獲取他們的例項。
getInstance()的返回值是一個物件的引用,並不是一個新的例項,所以不要錯誤的理解成多個物件,單例實現起來也很容易,看如下demo:
懶漢式(執行緒安全)
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; } }
列舉類
這種方式是Effective Java作者Josh Bloch 提倡的方式,它不僅能避免多執行緒同步問題,而且還能防止反序列化重新建立新的物件,可謂是很堅強的壁壘啊,不過,個人認為由於1.5中才加入enum特性,用這種方式寫不免讓人感覺生疏。
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; }