大家可能知道在复杂的并且速度较慢的报表,我们就使用先计算数据,然后再缓存起来,然后在访问报表的时候把直接读缓存就行,所以就可能有"重算" 的功能,来更新这个缓存,所以我们就要限制,在有人重算的时候,保证别人不能重算,在单一的时刻只能一个人在重算,我现在就把我刚学的代码共享出来
using
System;
namespace SigletonPattern.Sigleton
... {
/**//// <summary>
/// 功能:在C#用双重锁定实现单件模式
/// 编写:jiekeng
namespace SigletonPattern.Sigleton
... {
/**//// <summary>
/// 功能:在C#用双重锁定实现单件模式
/// 编写:jiekeng
/// 日期:2006年10月20日
/// </summary>
public class DoubLockSigleton
...{
private static volatile DoubLockSigleton instance;
/**//// <summary>
/// 辅助锁对象,本身没有意义
/// </summary>
private static object syncRoot = new Object();
/**//// <summary>
/// 构造方法改为Private
/// </summary>
private DoubLockSigleton()
...{
}
public static DoubLockSigleton Instance
...{
get
...{
if (instance == null)
...{
lock (syncRoot)
...{
if (instance == null)
instance = new DoubLockSigleton();
return instance;
}
}
else
...{
return null;
}
}
}
public static void SetInit()
...{
instance = null;
}
}
}
/// </summary>
public class DoubLockSigleton
...{
private static volatile DoubLockSigleton instance;
/**//// <summary>
/// 辅助锁对象,本身没有意义
/// </summary>
private static object syncRoot = new Object();
/**//// <summary>
/// 构造方法改为Private
/// </summary>
private DoubLockSigleton()
...{
}
public static DoubLockSigleton Instance
...{
get
...{
if (instance == null)
...{
lock (syncRoot)
...{
if (instance == null)
instance = new DoubLockSigleton();
return instance;
}
}
else
...{
return null;
}
}
}
public static void SetInit()
...{
instance = null;
}
}
}
这是核心的代码,我们现在使用客户调用,看看有
DoubLockSigleton s1
=
DoubLockSigleton.Instance;
if (s1 != null )
... {
Response.Write(s1.ToString());
}
else
... {
Response.Write("<script language='javascript'>window.alert('已经有人在重算')</script>");
}
if (s1 != null )
... {
Response.Write(s1.ToString());
}
else
... {
Response.Write("<script language='javascript'>window.alert('已经有人在重算')</script>");
}
然后是进行类的初始化,不然的话老是"有人在重算"那可不行,好了,一个简单的模型就出来了