此方法是線程安全的嗎?它似乎好像它不是...C# - 參數在靜態方法中是安全的嗎?
public static void Foo(string _str, Guid _id)
{
_str = _str + _id.ToString();
/*
Do Stuff
*/
return
}
此方法是線程安全的嗎?它似乎好像它不是...C# - 參數在靜態方法中是安全的嗎?
public static void Foo(string _str, Guid _id)
{
_str = _str + _id.ToString();
/*
Do Stuff
*/
return
}
在這種情況下,參數是兩個不可變的值。在一個方法中,只有一個線程在這組參數上運行,因爲調用該方法的多個線程將分別擁有自己的堆棧和執行上下文,這意味着每個線程都有自己獨立的一組參數和局部變量,線程可以影響這些變量。
因此,這是完全線程安全的關於這兩個變量。
請注意,傳遞參考的參數不一定是線程安全的,因爲這可能允許在兩個或更多個線程之間共享單個變量,這將需要同步。另外,如果您將不是不可變的引用類型實例(即:自定義類)作爲參數傳遞,那麼該類的內部狀態將需要同步,因爲它可能會被多個線程使用。 參考本身將是線程安全的,因爲它作爲副本傳遞(除非通過使用ref
傳遞)。
參數本身在定義上是線程安全的。不管方法是否爲static
。
然而,它們可能是對其他數據的引用,並且它不是線程安全的。
你的例子使用了一個值類型和一個不可變的引用類型,所以這個特定的情況是確定的。
(注意:'System.String'並不是真正的不可變的。感謝Microsoft沒有在.NET中實現const-correctness。) –
請問在這裏,'const-correctness'的含義是什麼? 它是一個指向常量實現的內部指針嗎? 我知道每次我們重新分配一個字符串var時,它會使用新的內存位置而不是覆蓋舊的。 – Vaibhav
你的意思是「在一個靜態方法內」嗎?如果是這樣的話,那麼謝謝你!據我所知 – Adam
@Adam如果方法是靜態的,它實際上並不重要 - 同樣的問題也適用(關於參數列表)。 –
@Reed啊,我明白了。但是,如果第二行是'newStr = ...'''newStr''是一個私有屬性,那麼它會導致線程問題。正確? – Adam