1

是的,目前我对 C# 语言规范和可能破译的教程很感兴趣。我阅读了多个关于线程安全单例类的问题和答案/文章。

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

我读得越多,我就越沉迷于这些信息。有人可以指导我更好地了解

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

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

4

4 回答 4

1

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

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

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

于 2013-02-18T12:41:23.733 回答
1
  1. 当您想提高性能时,您会遇到必须使用线程的情况,因此在使您的应用程序线程安全时,您可以避免一些竞争情况。

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

于 2013-02-18T12:41:25.570 回答
1

单例模式有多种版本,有些是线程安全的,有些不是:

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

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

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

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

现在可以出现这样一种情况,主线程在x为5的时候进入if块,开始执行doSomething方法,然后是SecondThread,在x还是5的时候进入if循环,然后主线程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();
        }

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

于 2013-02-18T12:42:13.120 回答
0

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

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

于 2015-03-15T17:11:37.533 回答