2013-06-21 36 views

回答

15

在這種情況下,參數是兩個不可變的值。在一個方法中,只有一個線程在這組參數上運行,因爲調用該方法的多個線程將分別擁有自己的堆棧和執行上下文,這意味着每個線程都有自己獨立的一組參數和局部變量,線程可以影響這些變量。

因此,這是完全線程安全的關於這兩個變量

請注意,傳遞參考的參數不一定是線程安全的,因爲這可能允許在兩個或更多個線程之間共享單個變量,這將需要同步。另外,如果您將不是不可變的引用類型實例(即:自定義類)作爲參數傳遞,那麼該類的內部狀態將需要同步,因爲它可能會被多個線程使用。 參考本身將是線程安全的,因爲它作爲副本傳遞(除非通過使用ref傳遞)。

+0

你的意思是「在一個靜態方法內」嗎?如果是這樣的話,那麼謝謝你!據我所知 – Adam

+2

@Adam如果方法是靜態的,它實際上並不重要 - 同樣的問題也適用(關於參數列表)。 –

+0

@Reed啊,我明白了。但是,如果第二行是'newStr = ...'''newStr''是一個私有屬性,那麼它會導致線程問題。正確? – Adam

5

參數本身在定義上是線程安全的。不管方法是否爲static

然而,它們可能是對其他數據的引用,並且它不是線程安全的。

你的例子使用了一個值類型和一個不可變的引用類型,所以這個特定的情況是確定的。

+0

(注意:'System.String'並不是真正的不可變的。感謝Microsoft沒有在.NET中實現const-correctness。) –

+0

請問在這裏,'const-correctness'的含義是什麼? 它是一個指向常量實現的內部指針嗎? 我知道每次我們重新分配一個字符串var時,它會使用新的內存位置而不是覆蓋舊的。 – Vaibhav