C#靜態建構子是執行緒安全的嗎?
考慮以下單例實作:
<code class="language-csharp">public class Singleton { private static Singleton instance; private Singleton() { } static Singleton() { instance = new Singleton(); } public static Singleton Instance { get { return instance; } } }</code>
這個實作是線程安全的嗎?
答案:
靜態建構子(如範例所示)保證在應用程式域中僅運行一次,早於任何類別的實例被建立或靜態成員被存取之前(https://www.php.cn /link/362c6840e40a65edd557a108c219f8f0)。
因此,單例實例的初始構造是執行緒安全的,這意味著它不需要鎖定或空值測試。但是,這並不保證可以以同步方式使用單例物件。
為了實現對單例實例的任何使用的同步,可以使用幾種方法。一種方法如下圖所示:
<code class="language-csharp">public class Singleton { private static Singleton instance; // 添加静态互斥体以同步实例的使用。 private static System.Threading.Mutex mutex; private Singleton() { } static Singleton() { instance = new Singleton(); mutex = new System.Threading.Mutex(); } public static Singleton Acquire() { mutex.WaitOne(); return instance; } // 每次调用Acquire()都需要调用Release() public static void Release() { mutex.ReleaseMutex(); } }</code>
此實作引入了靜態互斥體以同步對單例實例的存取。為了確保正確的同步,必須對每個實例的取得(Acquire())進行釋放(Release())。
以上是C# 的靜態建構子對於單例實作來說是執行緒安全的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!