有過編程經驗的朋友都知道設計模式中的單例模式,最近又重新看了一遍設計模式,今天將單例模式的幾種形式介紹一下:
1、懶漢形式(延遲加載)
Singleton.java 1
2 3 4 5 6 7 8 9 10 11 12 13 |
|
這個是標准的單例模式,通過newInstance里面的判斷來進行延遲加載單例對象,這里加了synchronized關鍵字可以避免多線程問題,但會影響程序性能。
2、餓漢形式(貪婪加載)
Singleton.java 1
2 3 4 5 6 7 8 9 10 |
|
在單例對象聲明的時候就直接初始化對象,可以避免多線程問題,但是如果對象初始化比較復雜,會導致程序初始化緩慢。
3、雙重檢查加鎖
Singleton.java 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
這個是懶漢形式的加強版,將synchronized關鍵字移到了newInstance方法里面,同時將singleton對象加上volatile關鍵字,這種方式既可以避免多線程問題,又不會降低程序的性能。但volatile關鍵字也有一些性能問題,不建議大量使用。
4、Lazy initialization holder class
Singleton.java 1
2 3 4 5 6 7 8 9 10 11 12 |
|
這里創建了一個內部靜態類,通過內部類的機制使得單例對象可以延遲加載,同時內部類相當於是外部類的靜態部分,所以可以通過jvm來保證其線程安全。這種形式比較推薦。
5、枚舉
Singleton.java 1
2 3 |
|
單因素的枚舉類已經實現了單例,這種方法更加簡單。