高手请进:singleton(单例)模式

majiangshou 2003-03-20 03:13:01
阎博士的书《Java与模式》不错,singleton模式讲得很清楚。只是我的同事在使用.net,她问到我在.net里面处理单例模式的多线程问题,我不知道,特来请教高手。
...全文
50 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
glassprogrammer 2003-04-03
  • 打赏
  • 举报
回复
我的机器上原来是没有 .net 的, 昨天装了一下, 研究了一下这个东东, 确实有错误, 下面贴出改正后的可以编译运行的例子:
两个文件 Main.cs, SingtonClass.cs

SingletonClass.cs =========================================================
// created on 2003-4-3 at 17:27
using System;

sealed class SingletonClass{
private DateTime initDateTime;
private SingletonClass(){
DateTime dt = DateTime.Now;
Console.WriteLine("<<SingletonClass>>["+dt.ToString()+"]:Instance constructed.");
//记录下本实例的创建时间
this.initDateTime = dt;
}
public static readonly SingletonClass instance=new SingletonClass();
public String getInstanceInfo(){
DateTime dt = DateTime.Now;
String s = "<<SingletonClass>>["+dt.ToString()+"]:";
s += "This instance was created at ["+this.initDateTime.ToString()+"] .";
return s ;
}
}


Main.cs ===================================================================
// project created on 2003-4-3 at 17:27
using System;

class MainClass{
public static void Main(string[] args){
SingletonClass s1 = SingletonClass.instance;
Console.WriteLine(s1.getInstanceInfo());
delay(3);
SingletonClass s2 = SingletonClass.instance;
Console.WriteLine(s2.getInstanceInfo());
}

private static void delay(int seconds){
DateTime dStart = DateTime.Now;
DateTime dStop = dStart.AddSeconds(seconds);
Console.WriteLine("<<MainClass>>Delay from ["+dStart.ToString()+"] ......");
for (;DateTime.Now.CompareTo(dStop)<0;){
//Delay, do nothing
}
Console.WriteLine("<<MainClass>>Delay from ["+dStart.ToString()+"]"
+" to ["+DateTime.Now.ToString()+"] .");
}
}
lvkai 2003-03-28
  • 打赏
  • 举报
回复
我看了楼上的帖子之后,心情澎湃。马上就打算学习一下,不料好像不转呀?


using System;

sealed class Singleton
{
private Singleton(){
System.Console.WriteLine("create");
}

public static readonly Singleton Instance()=new Singleton();

public static void Main(){
System.Console.WriteLine("hello");
}
}

出错信息:

Microsoft (R) Visual C# .NET Compiler version 7.00.9466
for Microsoft (R) .NET Framework version 1.0.3705
Copyright (C) Microsoft Corporation 2001. All rights reserved.

Singleton.cs(10,51): error CS1002: ; expected

显然这是 public static readonly Singleton Instance()=new Singleton(); 这一行造成的,因为如果没有这一行,就没有错误。

希望高手或者原帖作者能解释一下。谢啦
glassprogrammer 2003-03-27
  • 打赏
  • 举报
回复
标题 从C#的Singleton设计模式实现看.NET Framework特性对开发者的重要性 niwalker(原作)

关键字 设计模式 C# .NET Framework



从C#的Singleton设计模式实现看.NET Framework特性对开发者的重要性



近来,我在学习如何在C#语言中使用设计模式中读到一些资料,其中有关Singleton设计模式引起了我的注意。

学过设计模式的开发者都知道Singleton模式。我想简要地解释一下这个设计模式是为那些尚未学习过设计模式的朋友。Singleton设计模式是告诉您如何在你的应用程序创建一个唯一类示例的全局对象,也就是说,这个对象只能被实例化一次,这个对象同时提供一个访问它的一个全局的访问点。这种对象如应用程序中的窗口管理器或者是打印假脱机、数据库连接池等。

现在让我们先看一下设计模式一书中对Singleton模式的C++实现(为了方便比较,我把实现的代码写成内联的方式):



class Singleton

{

public:

static Singleton* Instance()

{

if(_instance==0)

{

_instance=new Singleton;

}

return _instance;

}

protected:

Singleton();

Private:

Static Singleton* _instance;

};



Stington* Singleton::_instance=0;



这里我不想对上述的代码作解释,大家可以参阅本文后面提供的参考文献。

为了更好的理解C#,我这里也出示一下Java中的Singleton模式实现代码(不是有人认为C#是对Java的剽窃吗J):



class Singleton

{

public Singleton Instance()

{

if(_instace==null)

{

synchronized (Class.forName("Singleton"))

{

if (_instance == null)

{

_instance = new Singleton();

}

}

}

return _instance;

}

protected Singleton() {}

private static Singleton _instance = null;

}



在上述的Java代码中使用了双重检测机制,来避免多个线程的Singleton实例化问题。同样,我也不想对上述的代码做任何解释。



首先,让我们看一下C#中类似Java的实现:



class Singleton

{

public static Singleton Instance()

{

if(_instance==null)

{

lock (typeof(Singleton))

{

if(_instace==null)

{

_instance=new Singleton();

}

}

}

return _instance;

}

protected Singleton(){}

private static volatile Singleton _instance=null;

}



现在,是我们睁大眼睛的时候了,下面是利用.NET Framework平台优势实现Singleton模式的代码:



sealed class Singleton

{

private Singleton();

public static readonly Singleton Instance()=new Singleton();

}



非常吃惊是不是,不仅代码减少了许多,同时也解决了线程问题带来的性能上损失。有避免了编译器优化的问题。上述的代码真的能正常工作吗?如果能,那么它又是怎样工作的呢?

注意到,Singleton类被声明为sealed,以此保证它自己不会被继承,其次没有了Instance的方法,将原来_instance成员变量变成public readonly,并在声明时被初始化。通过这些改变,我们确实得到了Singleton的模式,原因是在JIT的处理过程中,如果类中的static属性被任何方法使用时,.NET Framework将对这个属性进行初始化,于是在初始化Instance属性的同时Singleton类实例得以创建和装载。而私有的构造函数和readonly(只读)保证了Singleton不会被再次实例化,这正是Singleton设计模式的意图。

本文不是要讨论设计模式,而只是想通过这个例子来说明一件事,那就是精通.NET Framework并将它灵活运用对实际应用开发的重要性。

glassprogrammer 2003-03-27
  • 打赏
  • 举报
回复
下面是利用.NET Framework平台优势实现Singleton模式的代码:



sealed class Singleton{
private Singleton();
public static readonly Singleton Instance()=new Singleton();
}



非常吃惊是不是,不仅代码减少了许多,同时也解决了线程问题带来的性能上损失。有避免了编译器优化的问题。上述的代码真的能正常工作吗?如果能,那么它又是怎样工作的呢?

注意到,Singleton类被声明为sealed,以此保证它自己不会被继承,其次没有了Instance的方法,将原来_instance成员变量变成public readonly,并在声明时被初始化。通过这些改变,我们确实得到了Singleton的模式,原因是在JIT的处理过程中,如果类中的static属性被任何方法使用时,.NET Framework将对这个属性进行初始化,于是在初始化Instance属性的同时Singleton类实例得以创建和装载。而私有的构造函数和readonly(只读)保证了Singleton不会被再次实例化,这正是Singleton设计模式的意图。

sunni 2003-03-27
  • 打赏
  • 举报
回复
?你指的是?

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧