2011-12-21 33 views
2
public class Sample{ 

    private const ="constant string"; 

    public static object StaticMethod(args){ 

    var result= SomeOtherClass.StaticMethod(const,args); 

    return result; 

    } 

} 

此代碼是否線程安全?共享成員(const)的類的靜態方法將是線程安全的?

+1

這取決於,SomeOtherClass.StaticMethod做什麼? – 2011-12-21 12:59:15

+4

如果您發佈*有效*代碼開始,這將有所幫助。 – 2011-12-21 13:00:47

+0

@JonSkeet:在這種情況下,它不會真的幫助:) – SLaks 2011-12-21 13:03:46

回答

1

常量是線程安全的百般,因爲他們是在編譯時編譯成其真實的價值和他們的價值觀從來沒有計劃的執行過程中,無論有多少線程訪問它:)

一旦你將改變編譯代碼編譯器會將常量的實際值替換爲常量變量的所有引用,在你的情況下它是「常量字符串」 因此它的生命週期永遠不會改變。直到你自己改變常量變量的值並重新編譯代碼。

我給了Eric Lippert的參考資料,因爲他是C#編譯器團隊的主要開發人員

Eric's blog

一個不可改變的數據結構的大肆吹捧的好處是, 他們是「線程」。 由於它們不能被寫入,所以你永遠不會寫入 遇到寫操作被中斷 一個線程切換的情況,導致另一個線程讀取不一致的數據 結構。然而,相信僅僅因爲數據結構不允許你改變它的內容, 的實現必須是線程安全的!

2

您需要添加鎖定以確保線程安全,特別是如果SomeOtherClass.StaticMethod有副作用。靜態不會自動使函數線程安全。

一般來說,如果你所做的只是的讀取,那麼就沒有線程安全問題(除了資源爭用之外)。

1

你的問題是無法回答的。

它完全取決於靜態方法的作用。
例如,如果靜態方法訪問UI,即使從鎖內調用它也不會線程安全。