1. 程式人生 > 資訊 >iQOO Neo5S 將於 12 月 20 日釋出: 雙芯再進化

iQOO Neo5S 將於 12 月 20 日釋出: 雙芯再進化

簡單點來說,就是一個應用程式中,某個類的例項物件只有一個,你沒有辦法去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;
   }