2010-10-11 76 views
1

在C#中,一個類級別的變量不是線程安全的(任何例外情況?請告訴我)。所以我將不得不將這個變量的用法(比如在同一個類中的方法中)封裝在一個鎖中。爲什麼實例化類中需要鎖?不是每個實例都有自己的數據等嗎?

但是,使用new的想法使我認爲每個類實例都有自己的實例等,並且一個實例變量永遠不會共享,所以對該方法的調用永遠不會看到任何共享數據。那麼爲什麼一個實例化的類需要鎖定它的類級變量呢?只有當兩個線程訪問相同的內存地址時才需要鎖,但我認爲情況總是如此。

感謝

回答

4

您可以創建一個類的實例,並從多個線程訪問它。例如:

MyClass classInstance = new MyClass(); 
Task.Factory.StartNew(() => 
     { 
      classInstance.DoSomething(); 
     }); 

Task.Factory.StartNew(() => 
     { 
      classInstance.DoSomething(); 
     }); 

這兩個任務將執行在後臺線程,並使用相同的實例 - 由「Children子」的一個指向。如果類是可變的,這需要同步。

1

相同的對象實例可以同時由多個線程調用方法。

1

主題可以共享內存,這是什麼讓你來回傳遞數據。進程阻止你直接共享內存。因此,同一進程中的另一個線程理論上可以同時訪問一個變量。

0

只有當兩個線程訪問相同的內存地址時才需要鎖,但我認爲這總是不會如此?

它並不總是這樣,不,它取決於你如何編寫你的程序。

如果你的程序從不同的線程改變了同一個實例,你需要某種形式的鎖定來防止它們踩到別人的腳趾。

如果您只在一個線程中訪問您的類的實例,則不需要鎖定。

+0

不可變(初始化)類型:-) – 2010-10-11 23:05:24

相關問題