换句话说,这个 Singleton 实现线程安全吗:
public class Singleton { private static Singleton instance; private Singleton() { } static Singleton() { instance = new Singleton(); } public static Singleton Instance { get { return instance; } } }
在创建类的任何实例或访问任何静态成员之前,静态构造函数保证在每个应用程序域中只运行一次。https://docs.microsoft.com/en- us/dotnet/csharp/programming-guide/classes-and-structs/static- constructors
所示的实现对于初始构造是线程安全的,也就是说,构造 Singleton 对象不需要锁定或空测试。但是,这并不意味着实例的任何使用都会被同步。有多种方法可以做到这一点;我在下面展示了一个。
public class Singleton { private static Singleton instance; // Added a static mutex for synchronising use of 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; } // Each call to Acquire() requires a call to Release() public static void Release() { mutex.ReleaseMutex(); } }