如果我在多线程程序中访问单例,会发生什么

时间:2011-11-04 09:57:17

标签: multithreading singleton nullpointerexception

编辑:好的,它现在有效。我不知道究竟是什么是最糟糕的问题,但我没有做过一些锁定,以避免竞争条件。另外,我将“volatile”关键字添加到单例的实例变量的deklaration中。

如果我有一些线程正在运行并在一个线程中我访问一个单例(可能是在另一个线程中创建),我得到一个新的“单例”,就每个访问的线程调用单例的构造函数它在他的记忆空间第一次?我明白了吗?

问题在于我的应用程序我有一个由主线程创建的单例。如果我然后调用Singleton.Instance.somemethod(...)我总是得到空指针异常或空列表,即使列表是在主线程中创建并填充的?

有没有办法处理这个问题,这样我就可以在所有运行的线程中使用单例的相同的实例?某种方式同步整个实例?

谢谢。

编辑:抱歉缺少一些非常重要的信息。我在Visual Studio 2010 Professional下使用C#和.NET Framework 4.0。

我用这种方式创建了Singleton:

 static readonly object _padlock = new object();

    public static StaticAnalyzer Instance
    {
        get
        {
            lock (_padlock)
            {
                if (_instance == null)
                {
                    _instance = new StaticAnalyzer();
                }
                return _instance;
            }
        }
    }

在后台,每个线程都有自己的虚拟内存空间吗?因此,如果我在主线程中创建单例,然后使用task.factory创建一些工作线程,并且工作线程调用实例,为什么它们会获得真正的单例?因为static关键字?

1 个答案:

答案 0 :(得分:1)

不,单个(如果实现正确)将只是所有线程的一个。像System.DBNull一样。否则它不是单身人士。您的代码必须在某处出错。