在多线程情况下如何解决?
using System;
using System.Collections.Generic;
using System.Text;
namespace Singleton
{
class Singleton
{
//构造函数私有化,保证不被显式实例化
private Singleton() { }
//定义属性,返回Singleton对象
private static Singleton singleton;
public static Singleton Instance
{
get
{
if (singleton == null)
singleton = new Singleton();
return singleton;
}
}
}
}
//多线程版本的Singleton
namespace SingletonMultiThread
{
class Singleton
{
private static object lockHelper = new object();
//构造函数私有化,保证不被显式实例化
private Singleton() {}
//定义属性,返回Singleton对象
private static volatile Singleton singleton = null;
public static Singleton Instance
{
get
{
if (singleton == null)
{
lock (lockHelper)
{
if (singleton == null)
singleton = new Singleton();
}
}
return singleton;
}
}
}
}
//经典的Singleton实现:仅仅适合无参构造器对象(可用属性实现扩展)
namespace classicalSingleton
{
sealed class Singleton
{
private Singleton() { }
//内联初始化,后面的new是个静态构造器
public static readonly Singleton Instance = new Singleton();
}
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.Instance;
Singleton s2 = Singleton.Instance;
if (object.ReferenceEquals(s1, s2))
Console.WriteLine("两个对象是相同的实例。");
else
Console.WriteLine("两个对象非相同的实例。");
}
}
}
using System.Collections.Generic;
using System.Text;
namespace Singleton
{
class Singleton
{
//构造函数私有化,保证不被显式实例化
private Singleton() { }
//定义属性,返回Singleton对象
private static Singleton singleton;
public static Singleton Instance
{
get
{
if (singleton == null)
singleton = new Singleton();
return singleton;
}
}
}
}
//多线程版本的Singleton
namespace SingletonMultiThread
{
class Singleton
{
private static object lockHelper = new object();
//构造函数私有化,保证不被显式实例化
private Singleton() {}
//定义属性,返回Singleton对象
private static volatile Singleton singleton = null;
public static Singleton Instance
{
get
{
if (singleton == null)
{
lock (lockHelper)
{
if (singleton == null)
singleton = new Singleton();
}
}
return singleton;
}
}
}
}
//经典的Singleton实现:仅仅适合无参构造器对象(可用属性实现扩展)
namespace classicalSingleton
{
sealed class Singleton
{
private Singleton() { }
//内联初始化,后面的new是个静态构造器
public static readonly Singleton Instance = new Singleton();
}
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.Instance;
Singleton s2 = Singleton.Instance;
if (object.ReferenceEquals(s1, s2))
Console.WriteLine("两个对象是相同的实例。");
else
Console.WriteLine("两个对象非相同的实例。");
}
}
}