2013-02-18 54 views
1

是的,目前我已经习惯了C#语言规范和可能会破译的教程。我阅读了多个有关线程安全单例类的问题和答案/文章。为什么静态类和单例模式类不是线程安全的?

这里是我已经探讨了帖子:

我越读与信息我得到的更多淹死。有人可以指导我更好地了解

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

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

+3

这是一个* *的实施是安全或不安全的 - 而不是“单身一般”。 – 2013-02-18 12:38:53

+1

也许是最好的解释:落实以乔恩斯基特在C#Singleton模式](http://csharpindepth.com/articles/general/singleton.aspx) – Habib 2013-02-18 12:39:54

+4

'“?为什么开发商关心线程安全”' - 因为他们喜欢他们的代码,就像他们喜欢thAsynchronous.eir的妙语。 – David 2013-02-18 12:39:56

回答

1

有Singleton模式的各种版本,有些是线程安全的介绍线程安全,有些则不是:

你可以通过文章乔恩Skeet在这些模式。

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

线程安全是很重要的,以确保您有正确的价值观玩。

在以下示例中两个线程调用,这意味着通过由5乘以它,如果它是5

现在可以存在主线程进入而x中如果块的场景来设置值x到25的方法是5,开始执行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(); 
     } 

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

+0

+1。我的问题是更好地了解线程环境中这些类中真正发生的事情。虽然你的最后一句话仍然是我期待的答案。你能否给我提供防不胜防的例子文章? :) – aspiring 2013-02-18 13:05:07

+0

我试图把一个例子,mayb它帮助! – Igoy 2013-02-18 14:37:28

+0

谢谢。我正在尝试各种文章和你的教程。让我有时回来。 – aspiring 2013-02-18 16:41:22

1
  1. 当你想提高你的表现,你会encouter情况下,您将不得不使用线程,这样使你的应用程序时,线程安全的你可以避免一些种族的情况。

  2. Static和Singleton类将共享应用程序整个实例的值。从多个线程访问该对象时,可以重用或覆盖另一个对象也在使用的变量。这会导致一些非常奇怪的输出,并且很难找到正在发生的事情,因为在测试用例中很难模拟这种情况。您可以在methodes实施lock在这些类

+0

为了确保可重用组件的行为安全/封装,是不是有Static/Singleton类(使用非intantianti方法)的全部意义?对于例如在线程环境中,多个组件可以在Static类/接口中实现静态方法。像100个用户一直登录到数据库系统/ ATM系统。那怎么可能不是线程安全的? :)你能澄清一点吗? – aspiring 2013-02-18 12:47:42

+0

这是不合用的。我想解释的是,静态和单例类包含的值是整个应用程序共享的。因此,无论何时将值存储在静态或Singleton中,都需要确保您希望该变量适用于整个应用程序。 – JMan 2013-02-18 12:52:45

+0

如果将2方法添加到singletone类中,他首先设置一个变量,然后在第二个函数中使用第一个变量执行一些函数。您可能会遇到其中变量被线程一组,然后由线程B组的情况下,为线程A执行的方法,那么对于B.用于线程A的方法会产生无效结果 – JMan 2013-02-18 12:54:45

0

一般来说因为每次一个实例是由一个线程所要求的容器移交相同的实例Singleton模式不是线程安全的。这可能导致多个线程具有相同的实例。

但也有办法让你的单身线程安全的。