核心:控制用户使用new对一个类实例构造器的任意调用。
Singleton一般不要支持ICLoneable,因为此接口支持克隆,与Singletong初衷不同;也不要支持序列化,也会产生类似的问题。
1.单线程
public class Singleton
{
private static Singleton instance;//设置一个静态实例,全局唯一
public static Singleton Instance //提供一个全局访问点
{
get
{
if (instance == null)//只有用户需要这个实力的时候,才去初始化。 语句1
{
instance = new Singleton();//语句2 如果有两个线程此时都在语句1之后,并且都在语句2之前,那么此时就会创建多个实例了
}
return instance;
}
}
private Singleton() //约束构造函数
{
}
}
//Main函数的测试代码
// Singleton t1 = Singleton.Instance;
// Singleton t2 = Singleton.Instance;
//Console.WriteLine(object.ReferenceEquals(t1, t2));
public class Singleton
{
private static volatile Singleton instance;//volatile关键字表示此字段不接受编译器的代码优化调整,严格保证多线程
private static object lockHelper = new object();//lock辅助对象
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (lockHelper)
{
if (instance == null)//双检查
{
instance = new Singleton();
}
}
}
}
}
private Singleton()
{
}
}
public class Singleton
{
public static Singleton instance = new Singleton();//内联初始化,访问静态成员,首先会调用静态构造器,即new Singleton();会被放到静态构造器中执行
private Singleton()
{
}//和下面的代码等价
//public static Singleton instance;
//static Singleton()//静态构造机制会自动加锁维护,实现线程安全
//{
// instance = new Singleton();
//}
//private Singleton()
//{ }
//*****************************************************************************************
//关于静态构造器的特性解释:
//a.无参数,无修饰访问符
//b.用于初始化任何静态数据
//c.在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数,初始化类
//d.不能直接调用
//e.用户无法控制何时调用,只能有编译器决定调用
//f.用于执行仅需执行一次的特定操作
//****************************************
//缺点不支持参数,但是可以用属性来实现支持参数
int x;
int y;
public int X
{
get { return this.x; }
set { this.x = value; }
}
public int Y
{
get { return this.y; }
set { this.y = value; }
}
}


浙公网安备 33010602011771号