單例模式的5種形式


 

有過編程經驗的朋友都知道設計模式中的單例模式,最近又重新看了一遍設計模式,今天將單例模式的幾種形式介紹一下:

1、懶漢形式(延遲加載)

Singleton.java
1
2 3 4 5 6 7 8 9 10 11 12 13 
public class Singleton{  private static Singleton singleton;   private Singleton() {  }   public synchronized static Single newInstance() {  if (singleton== null) {  singleton= new Singleton();  }  return singleton;  } } 

這個是標准的單例模式,通過newInstance里面的判斷來進行延遲加載單例對象,這里加了synchronized關鍵字可以避免多線程問題,但會影響程序性能。

2、餓漢形式(貪婪加載)

Singleton.java
1
2 3 4 5 6 7 8 9 10 
public class Singleton {  private static Singleton singleton= new Singleton();   private singleton() {  }   public static Singleton newInstance() {  return singleton;  } } 

在單例對象聲明的時候就直接初始化對象,可以避免多線程問題,但是如果對象初始化比較復雜,會導致程序初始化緩慢。

3、雙重檢查加鎖

Singleton.java
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 
public class Singleton {  private volatile static Singleton singleton;   private Singleton() {  }   public static Singleton newInstance() {  if (singleton == null) {  synchronized (Singleton.class) {  if (singleton == null) {  singleton = new Singleton();  }  }  }  return singleton;  } } 

這個是懶漢形式的加強版,將synchronized關鍵字移到了newInstance方法里面,同時將singleton對象加上volatile關鍵字,這種方式既可以避免多線程問題,又不會降低程序的性能。但volatile關鍵字也有一些性能問題,不建議大量使用。

4、Lazy initialization holder class

Singleton.java
1
2 3 4 5 6 7 8 9 10 11 12 
public class Singleton {  private static class SingletonHolder {  private static Singleton singleton = new Singleton();  }   private Singleton() {  }   public static Singleton newInstance() {  return SingletonHolder.singleton;  } } 

這里創建了一個內部靜態類,通過內部類的機制使得單例對象可以延遲加載,同時內部類相當於是外部類的靜態部分,所以可以通過jvm來保證其線程安全。這種形式比較推薦。

5、枚舉

Singleton.java
1
2 3 
public enum Singleton {  singleton } 

單因素的枚舉類已經實現了單例,這種方法更加簡單。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM