c#asp mvc singleton垃圾收集

时间:2011-03-26 20:08:01

标签: c# asp.net-mvc garbage-collection singleton

我的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)我在那里做了正确的锁定吗?

3 个答案:

答案 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)

您可以在http://www.yoda.arachsys.com/csharp/singleton.html

找到THE defacto singleton实施