【发布时间】:2011-12-05 13:26:49
【问题描述】:
我遇到了单例模式的问题。
这真的很奇怪,但看起来我的单例模式有两三个实例。 我的网站是一个带有计时器的操作网站,我正在使用我的单例对象处理这些计时器和价格。
发生的情况是,有些人看到一些价格,而其他人在不同的网络中总是看到其他价格。
例如,在我的办公室,我的人看到一些拍卖价格为 0.56 美分,每个人看到的都一样,但在另一个网络中,例如我的房子,我看到 0.55 美分,而且计时器的值也不同。
话虽如此,我已经通过生成 GUID 并将其记录在我的日志文件中来测试我的 Singleton。这是一些代码
public class Singleton
{
private static Singleton instance;
private static System.Threading.Mutex mutex;
System.Guid token;
private Singleton() {
token = System.Guid.NewGuid();
Logger.Log("New singleton Instance" + token.toString());
}
static Singleton()
{
instance = new Singleton();
mutex = new System.Threading.Mutex();
}
public static Singleton Acquire()
{
mutex.WaitOne();
return instance;
}
// Each call to Acquire() requires a call to Release()
public static void Release()
{
mutex.ReleaseMutex();
}
public void SomeAction()
{
Logger.Log(token.toString() + " - SomeAction");
}
}
在这段代码中,我在构造函数上生成令牌,并记录新单例的创建,然后...在SomeAction 方法中,我记录谁在执行该操作。
在此之后,我们进行了几次测试并下载了日志文件。
令我惊讶的是,我只看到一个正确的“New Singleton Instance bla”。但是随后,许多对 SomeAction 方法的调用使用不同的 GUID,这很奇怪。
我检查了对象仅在静态构造函数中创建,并且我还检查了任何地方都没有手动创建。
有关更多信息,这只发生在我的生产服务器上,这是一个 goDaddy 主机。我问过我的网站是否有多个应用程序池,他们说只有一个应用程序池。
【问题讨论】:
-
尝试按照here的建议实现你的单例。
-
我在想你为什么要创建静态构造函数?
-
也许您可以使用一些 Dispose 日志记录并在各处添加 Try Catches 来诊断问题。祝你好运。
-
你可能想了解为什么单身人士是邪恶的:kellabyte.com/2010/06/05/the-evil-singleton-and-its-impact
-
单身人士:说不。这是另一个:jalf.dk/singleton