我的asp mvc应用程序中有一个类,它保留了一些“全局”数据。它被实现为单身人士。它看起来像这样:
class InfoStrings
{
public List<string> strings = new List<string>();
static InfoStrings me = null;
private InfoStrings()
{ }
public static InfoStrings GetMe()
{
if(me == null)
me = new InfoStrings();
return me;
}
}
现在从控制器的代码我通过锁定它来访问这个类:
lock (InfoStrings.GetMe())
{
...
}
好的,2个问题:
1)理论上,我的InfoStrings
对象可以被垃圾收集吗?
2)我在那里做了正确的锁定吗?
答案 0 :(得分:3)
1)理论上,我的InfoStrings对象可以被垃圾收集吗?
不,这是一个静态字段,一旦分配就不会被垃圾收集。
2)我在那里做了正确的锁定吗?
我建议您锁定私有静态对象:
private static object _syncRoot = new object();
...
lock (_syncRoot)
{
var instance = InfoStrings.GetMe();
}
在C#中实现单例模式时,您可能还会发现following article非常有用。例如:
public sealed class InfoStrings
{
private InfoStrings()
{
}
public static InfoStrings Instance
{
get { return Nested.instance; }
}
private class Nested
{
static Nested()
{
}
internal static readonly InfoStrings instance = new InfoStrings();
}
}
然后你不需要锁定才能获得实例:
var instance = InfoStrings.Instance;
答案 1 :(得分:1)
如果您使用的是.NET 4.0,那么您不必执行任何操作。您可以创建一个Lazy类型的静态只读字段,将LazyThreadSafetyMode.ExecutionAndPublication传递给构造函数(以及您的Func以指示如何创建实例)以保证该值仅创建一次。
然后,您公开一个只调用Lazy.Value属性的属性,以返回延迟加载的单例值。
(从singleton pattern in vb复制的文字)
答案 2 :(得分:0)