看到一管关于单例模式的文章,感觉写的相当不错,链接:http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html其最后一段“饿汉模式”的代码如下: public sealed class Singleton
{
private static readonly Singleton instance = new Singleton(); private Singleton()
{
} public static Singleton GetInstance()
{
return instance;
}
}
原文中提到:
“readonly关键字可以跟static一起使用,用于指定该常量是类别级的,它的初始化交由静态构造函数实现,并可以在运行时编译。在这种模式下,无需自己解决线程安全性问题,CLR会给我们解决。由此可以看到这个类被加载时,会自动实例化这个类,而不用在第一次调用GetInstance()后才实例化出唯一的单例对象。”现在的问题是如果去掉readonly单例模式还能不能正常使用?如果能正常使用,跟加readonly的模式有何区别?C#readonly单例
{
private static readonly Singleton instance = new Singleton(); private Singleton()
{
} public static Singleton GetInstance()
{
return instance;
}
}
原文中提到:
“readonly关键字可以跟static一起使用,用于指定该常量是类别级的,它的初始化交由静态构造函数实现,并可以在运行时编译。在这种模式下,无需自己解决线程安全性问题,CLR会给我们解决。由此可以看到这个类被加载时,会自动实例化这个类,而不用在第一次调用GetInstance()后才实例化出唯一的单例对象。”现在的问题是如果去掉readonly单例模式还能不能正常使用?如果能正常使用,跟加readonly的模式有何区别?C#readonly单例
不加readonly也能正常使用,只要不能让外部直接new就行了,只能通过里面的静态方法去拿到类的实例
private Singleton instance = null;
private Singleton()
{ } public static Singleton Getinstance()
{
if (instance == null)
{
instance = new Singleton(); }
return instance;
}
加readonly是防止你在自身类(即Singleton )内部函数里修改它
另外二楼说的线程安全问题实际上是不存在的,因为静态构造器由CLR在第一次加载该类型时调用,CLR能够保证这个操作是线程安全的。
CLR via C#详细描述了这个问题,而且相比使用DCL(双重检查锁),贪婪加载(你所谓的饿汉模式)的Singleton更安全。