最近看到一个关于singleton的问题。上网查了一下。找到这个介绍比较详细:http://www.ddvip.net/program/c-/index10/2.htm
singleton在c#中有两种实现方式:
方法一: using System;
namespace csPattern.Singleton
{
public class Singleton
{
static Singleton uniSingleton = new Singleton();
private Singleton() {}
static public Singleton instance()
{
return uniSingleton;
}
}
} 方法二: using System;
namespace csPattern.Singleton
{
public class Singleton
{
static Singleton uniSingleton=null;
private Singleton() {}
static public Singleton instance()
{
if (null == uniSingleton)
{
uniSingleton = new Singleton();
}
return uniSingleton;
}
}
} 他的注释中说“上面方法二的初始化方式称为lazy initialization,是在第一次需要实例的时候才创建类的实例,与方法一中类的实例不管用不用一直都有相比,方法二更加节省系统资源。但是方法二在多线程应用中有时会出现多个实例化的现象。”
我不是很明白上面这句话,我个人认为两种方法都需要用instance()方法来创建实例的,为什么说方法一中不管用不用都有实例,你不去创建方法一中的实例,它怎么会有实例。还有就是很不明白方法一中的实例创建的过程,是不是先调用instance()然后在去new singleton();还是怎么样的。
singleton在c#中有两种实现方式:
方法一: using System;
namespace csPattern.Singleton
{
public class Singleton
{
static Singleton uniSingleton = new Singleton();
private Singleton() {}
static public Singleton instance()
{
return uniSingleton;
}
}
} 方法二: using System;
namespace csPattern.Singleton
{
public class Singleton
{
static Singleton uniSingleton=null;
private Singleton() {}
static public Singleton instance()
{
if (null == uniSingleton)
{
uniSingleton = new Singleton();
}
return uniSingleton;
}
}
} 他的注释中说“上面方法二的初始化方式称为lazy initialization,是在第一次需要实例的时候才创建类的实例,与方法一中类的实例不管用不用一直都有相比,方法二更加节省系统资源。但是方法二在多线程应用中有时会出现多个实例化的现象。”
我不是很明白上面这句话,我个人认为两种方法都需要用instance()方法来创建实例的,为什么说方法一中不管用不用都有实例,你不去创建方法一中的实例,它怎么会有实例。还有就是很不明白方法一中的实例创建的过程,是不是先调用instance()然后在去new singleton();还是怎么样的。
namespace csPattern.Singleton
{
public class Singleton
{
static Singleton uniSingleton = new Singleton();
private Singleton() {}
static public Singleton instance()
{
return uniSingleton;
}
}
} 方法二: using System;
namespace csPattern.Singleton
{
public class Singleton
{
static Singleton uniSingleton;
private Singleton() {}
static public Singleton instance()
{
if (null == uniSingleton)
{
uniSingleton = new Singleton _lazy();
}
return uniSingleton;
}
}
}
glassprogrammer 已经叙述的很详细了,也让我学到很多。
http://www-106.ibm.com/developerworks/java/library/j-dcl.html?loc=j
所以说:当使用方法一来实现singleton时会导致不管有没有实例化类对象,它都会实例化。因为你只要使用了类,它的静态变量就会被初始化(也就是创建了一个实例),可能那时你还不想实例化这个类。虽然这样的情况很少会发生,但理论上我想应该是这样。而第二种方法实现singleton中这个静态变量static Singleton uniSingleton;并没有实例化,只有声明。也就是在使用Singleton类之前不会被初始化,只有当调用了instance才实例化。所以说:方法二更加节省系统资源。
我是初学c#。对很多基础的东西不是很理解。呵呵不知道是不是这样的。
对于多线程问题可以用lock,但当看到了glassprogrammer的文章后,我想会用他介绍的方法。