2010-11-25 34 views
1

我一直有這種特定情況下擔心我永世。比方說,我的課看起來像這樣是類級屬性或變量線程安全

public class Person { 
public Address Address{get;set;} 
public string someMethod() 
{} 
} 

我的問題是,我被我的同胞開發商告訴類型地址的地址屬性格式,不是線程安全的。

來自Web請求的角度來看,每一個請求是在一個單獨的線程,每個 線程處理我的業務對象或代碼隱藏以下行時間,例如運行

var p = new Person(); 

它創建的新實例Person對象在堆上,因此實例被請求線程訪問,除非我在應用程序中產生了多個線程。

如果我錯了,請給我解釋一下爲什麼我錯了,爲什麼公共財產(地址)不是線程安全的?

任何幫助將非常感激。

謝謝。

回答

2

如果您的Person實例的引用在多個線程之間共享,那麼多個線程可能會更改導致競爭條件的Address。但是,除非您在靜態字段或Session中保存該引用(某種全球可訪問的地方),否則您無需擔心任何事情。

如果您在代碼中創建對象的引用,就像您上面顯示的那樣(var p = new Person();),那麼您完全是線程安全的,因爲其他線程將無法訪問這些對象的引用,而不訴諸惡意和惡意技巧。

+0

「除非你持有的是參考靜態字段或會話」的確,或者你傳遞對象的同一實例工作線程。 – 2010-11-25 16:33:24

+0

謝謝大家,現在真的很有意義。 – 2010-11-27 05:51:27

1

你的財產是不是線程安全的,因爲你沒有鎖定,以防止多次寫入物業踩着對方的腳趾。

然而,在您的情況,你沒有共享多個線程之間的類的實例,該屬性並不需要是線程安全的。被多個線程,其中每個線程可以改變對象的狀態之間共享

對象,那麼就需要所有的狀態改變要被保護的,只有一次一個線程可以修改的對象。

0

你應該罰款與此,但有幾件事情我擔心......

如果你的人目的是要進行修改或舉行一些一次性的資源,你可能會發現之一線程將無法讀取此變量。爲了防止這種情況發生,您需要在讀取/寫入對象之前鎖定對象,以確保它不會被其他線程踩到。最簡單的方法是使用lock {}結構。