为什么静态类和单例模式类不是线程安全的?

时间:2013-02-18 12:37:23

标签: c# static thread-safety singleton

是的,目前我正在接受C#语言规范以及可能的可解读教程。我读了很多关于线程安全的单例类的问题和答案/文章。

以下是我已经探讨过的帖子:

我阅读的越多,我就越被淹没了这些信息。有人可以指导我更好地理解

1)为什么开发人员关心线程安全?

2)静态类/单例类如何被确定为不是线程安全的? (试用的示例代码/示例教程很棒,因为我喜欢正确地学习这些基础知识)

4 个答案:

答案 0 :(得分:1)

  

为什么静态类和单例模式类不是线程安全的?

谁说所有单例模式类都不是线程安全的?有很多方法可以使类线程安全

见这里:http://csharpindepth.com/Articles/General/Singleton.aspx

答案 1 :(得分:1)

  1. 当你想提高你的表现时,你会遇到必须使用线程的情况,因此在使你的应用程序线程安全时你可以避免一些竞争情况。

  2. Static和Singleton类将共享整个应用程序实例的值。从多个线程访问该对象时,您可以重用或覆盖另一个对象也在使用的变量。这将导致一些非常奇怪的输出,有时很难找到正在发生的事情,因为它很容易在测试用例中模拟这一点。您可以在您的方法中实现lock以在这些类中引入线程安全性

答案 2 :(得分:1)

Singleton Pattern有各种版本,有些是线程安全的,有些则不是:

你可以阅读Jon Skeet关于这些模式的文章。

http://csharpindepth.com/articles/general/singleton.aspx

线程安全对于确保您正在玩正确的值非常重要。

在下面的示例中,两个线程调用一个方法,这意味着如果将值x设置为5,则将值x设置为25。

现在可能有一个场景,主线程进入if块,而x是5,并开始执行doSomething方法,然后是SecondThread,进入if循环,而x仍然是5.然后主线程A将修改x到25,然后SecondThread将其修改为125。

所以这里我们需要某种同步,以便不超过一个线程可以同时修改x。

private int x = 5;

        private void dosomething()
        {
        }
        private void multXby5if5() // Should make x =25, by multiplying 5  if it was 5, finally x should be 25
        {

            if (x == 5) // State A: SecondThread reaches here while x is still 5
            {
                dosomething(); //State A : Main thread reaches here

                x = x*5; // State B: Then Main Thread comes and makes x =25, then later SecondThread will come make x*5=25*5=125,

            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread tr = new Thread(multXby5if5);
            tr.Name = "SecondThread";
            multXby5if5();
            tr.Start();
        }

这不是最好的例子,但我希望它会对你有帮助。

答案 3 :(得分:0)

一般来说,单例模式不是线程安全的,因为每次线程请求实例时,容器都会移交同一个实例。这可能导致多个线程具有相同的实例。

但是有一些方法可以使您的Singleton线程安全。