最近看到一个关于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();还是怎么样的。

解决方案 »

  1.   

    static Singleton uniSingleton = new Singleton(); 这种内联静态初始化实际上是在静态构造函数中完成的,静态构造函数的运行时间是不确定的,但一定在第一次使用该类型之前发生,最有可能就是在第一次使用给类型任何功能的时候发生,哪怕只是调用typeof一下。还是建议用方法二,因为这样比较容易控制创建实例的时间
      

  2.   

    不好意思,我刚刚在这里找了一下singleton这方面的文章,感觉很详细!但还是没有解决针对上述两种方法的资源问题产生的原因?其他的方法  方法一: 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; 
    private Singleton() {} 
    static public Singleton instance() 

    if (null == uniSingleton) 

    uniSingleton = new Singleton _lazy(); 

    return uniSingleton; 


    }  
    glassprogrammer 已经叙述的很详细了,也让我学到很多。
      

  3.   

    Sigleton 通常不用于多线程。要用多线程的话,就用Double-Checked Locking下面的文章讲的很具体:
    http://www-106.ibm.com/developerworks/java/library/j-dcl.html?loc=j
      

  4.   

    我刚才顺着Ninputer的思路去考虑查了一下静态类型的初始化问题。好像是这样的:类在使用时之前,它的静态成员肯定要被初始化。我想到的两种初始化方法是:1、在类中声明在类中的静态构造函数中初始化。2、象static Singleton uniSingleton = new Singleton();这样初始化。但发现类中声明的静态变量没有初始化并不会导致编译错误,只是使用这个静态变量时会出现异常。
    所以说:当使用方法一来实现singleton时会导致不管有没有实例化类对象,它都会实例化。因为你只要使用了类,它的静态变量就会被初始化(也就是创建了一个实例),可能那时你还不想实例化这个类。虽然这样的情况很少会发生,但理论上我想应该是这样。而第二种方法实现singleton中这个静态变量static Singleton uniSingleton;并没有实例化,只有声明。也就是在使用Singleton类之前不会被初始化,只有当调用了instance才实例化。所以说:方法二更加节省系统资源。
    我是初学c#。对很多基础的东西不是很理解。呵呵不知道是不是这样的。
    对于多线程问题可以用lock,但当看到了glassprogrammer的文章后,我想会用他介绍的方法。