public class MyClass
{
//volatile 关键字指示一个字段可以由多同时执行的线程修改。 声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。 这样可以确保该字段在任何时间呈现的都是最新的值。
private static volatile MyClass _instance;
private static readonly object InstanceLock = new object();
public static MyClass Instance
{
get
{
if (_instance == null)
{
lock (InstanceLock)
{
if (_instance != null)
{
return _instance;
}
_instance = new MyClass();
}
}
return _instance;
}
}
//在.NET 中这种模式已用 Lazy<T>类实现了封装,内部就是使用了双检锁模式。 你最好还是使用 Lazy<T>,不要去实现自己的双检锁模式了。这样非常的简洁
public static MyClass Instance2 = new Lazy<MyClass>(() => new MyClass()).Value;
}
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
Thread th = new Thread(() => { Console.WriteLine("线程调用对象{0}", MyClass.Instance.GetHashCode()); });
th.Start();
}
for (int i = 0; i < 10; i++)
{
Thread th = new Thread(() => { Console.WriteLine("线程调用对象{0}", MyClass.Instance2.GetHashCode()); });
th.Start();
}
Console.ReadLine();
}
}