2013-02-18 69 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模式不是線程安全的。這可能導致多個線程具有相同的實例。

但也有辦法讓你的單身線程安全的。