2013-03-24 97 views
0

沒有任何線程會修改變量。他們都在閱讀。這安全嗎?多線程讀取靜態對象是否安全?

+0

相關:http://stackoverflow.com/questions/2076461/how-does-c-sharp-guarantees-the-atomicity-of-read-write-operations – 2013-03-24 05:10:30

+2

取決於變量的類型。 http://blogs.msdn.com/b/ericlippert/archive/2011/05/23/read-only-and-threadsafe-are-different.aspx – 2013-03-24 05:11:48

+0

@PeterRitchie您能詳細說明需要指定哪些信息這個問題可以回答? – Kyle 2013-03-24 05:23:11

回答

5

這取決於你的線程正在共享什麼資源。請看下面的例子:

public class MyClass 
{ 
    private int i; 
    public int Foo { get { return i++; } } 
} 

public static class SharedResources 
{ 
    public static const string SharedString; 
    public static readonly MyClass SharedMyClass; 
} 

在此代碼示例,參考到SharedString是線程安全的,因爲字符串是隻讀的在C#。但是,任何線程可能隨時調用SharedResources.SharedMyClass.Foo,並且由於增量不是線程安全的(除非使用Interlocked.Increment),讀取此屬性的線程可能會得到不一致的結果。

總之,如果一個類的公共API是隻讀的,但其內部不是線程安全的,那麼不安全的只是有多個線程讀取它。

0

爲了出現併發錯誤,至少有一個訪問必須是寫入/修改的。

小心不要把getters弄錯一個變量。他們可能會有訪問時不知道的含義。

+1

死鎖是併發錯誤嗎?如果一個或多個讀取觸發了一個需要鎖定的靜態構造函數,只有讀取才會發生死鎖。, – 2013-03-24 05:23:25

+0

好的,我的答案沒有考慮死鎖,只考慮了競爭條件。 Thx。他們肯定是併發錯誤! – Sebastian 2013-03-24 05:24:34

相關問題