class Singleton {
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton* _instance;
}
// Implementation
Singleton* Singleton::_instance = 0;
Singleton* Singleton::Instance() {
if (_instance == 0) {
_instance = new Singleton;
}
return _instance;
}
{
public static Singleton Instance() {
if (_instance == null) {
lock (typeof(Singleton)) {
if (_instance == null) {
_instance = new Singleton();
}
}
}
return _instance;
}
protected Singleton() {}
private static volatile Singleton _instance = null;
}
// .NET Singleton
sealed class Singleton
{
private Singleton() {}
public static readonly Singleton Instance = new Singleton();
}
大家可能會懷疑這還是Singleton嗎? 先看一個例子:
using System;
/// <summary>
/// Sample Singleton class
/// </summary>
sealed class SingletonCounter
{
public static readonly SingletonCounter Instance = new SingletonCounter();
private long Count = 0;
private SingletonCounter() { }
public long NextValue()
{
return ++Count;
}
}
class SingletonClient
{
//[STAThread]
static void Main()
{
for (int i = 0; i < 20; i++)
{
Console.WriteLine("Next singleton value: {0}",
SingletonCounter.Instance.NextValue());
}
}
}
在vs2005中新建一個c# console項目粘貼上面的代碼,ctrl+F5,一切ok. 下面解釋一下,首先是only one instance,
.net 在JIT階段, 靜態變量只有在使用時才被實例化, 關於線程安全,.net framework保證了靜態變量初始化安全.