典型的安全執行緒的Singleton實現是使用double-checked locking的實現,但是在.NET中我們並不需要使用double-checked locking就可以優雅地實現Singleton模式。
這個優美的Singleton實現基礎是.NET對運行期初始化的完整定義。它的優美之處是不需要典型的double-checked locking。
當CLR載入class
Singleton的時候,因為Singleton沒有static
variables需要被初始化,所以Singleton的初始化其實什麼也沒做。而對static class
LazyHolder來說,直到它被執行的時候才會被初始化。而static class
LazyHolder只有載Singleton.GetInstance()被執行的時候才會執行到。當第一次調用GetInstance()的時候
CLR才會載入和初始化LazyHolder這個class。對於LazyHolder class的初始化就是對static variable
Instance的初始化。而Instance的初始化就是執行Singleton的private
constructor。因為.NET保證class的initialization是serial的,就是說在載入和初始化的過程中我們不需要自己做同
步。因為初始化過程是一個serial的操作,所以對於後面的GetInstance,我們不需要做任何同步,它也會返回一個正確初始化的
Singleton對象。
實現代碼:
1 public class Singleton
2 {
3 private static class LazyHolder
4 {
5 public static readonly Singleton Instance = new Singleton();
6 }
7
8 private Singleton()
9 {
10 }
11
12 public static Singleton GetInstance()
13 {
14 return LazyHolder.Instance;
15 }
16 }