C#Singleton线程安全变量

时间:2014-12-31 18:02:46

标签: c# multithreading thread-safety singleton

我在这里提到了Jon Skeet的文章(http://csharpindepth.com/articles/general/singleton.aspx),第六版。

但是,我有一些私有变量,我想初始化一次,并被这个所谓的单例类中的方法使用。我在私有构造函数中初始化它们,但很快发现,在多线程场景( Task.Run )中调用方法时它们是null。

调试时,我发现私有构造函数在调用" Instance"时没有调用两次(应该是),所以我假设我的私有变量,不应该&# 39; t在那个时间点已经为空(成功"实例"调用)。

关于如何声明,初始化和使用这些变量的任何想法?

public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazy.Value; } }

    // my private variables
    private readonly string _plantCode;

    private Singleton()
    {
       var appSettings = ConfigurationManager.AppSettings;
       string _plantCode = appSettings["PlantCode"] ?? "Not Found";
    }

    public SomeMethod() 
    {
      var temp = _plantCode; // <== _plantCode becomes null here!
    }

}

1 个答案:

答案 0 :(得分:5)

这是问题所在:

string _plantCode = appSettings["PlantCode"] ?? "Not Found";

那不是分配给实例变量 - 它声明了一个新的本地变量。你只想要:

_plantCode = appSettings["PlantCode"] ?? "Not Found";

(顺便说一下,这会发生在正常类中的相同代码中 - 它与它是单身的事实无关。)