2011-08-08 116 views
1

在某些場景中,我對鎖定的概念有點困惑。讓我來解釋一下,假設我有以下幾點:C#多線程 - 鎖定

private readonly MyClass myObj; 

private void Go(object state) 
{ 
    // call an instance member of myObj, but does it need to be locked? 
    myObj.SomeMethod(state); 
} 

所以現在的問題是不MyObj中需要調用的someMethod時被鎖定?它是隻讀的,但是由於多個線程可以調用myObj的實例方法SomeMethod以及不同的狀態,這不會引起問題?

謝謝。

回答

6

變量是隻讀的,但對象可以是可變的或不可變的 - 甚至並沒有真正告訴你它是否可以安全地從多個線程中使用。

換句話說,它取決於MyClass的實現,並且您是否期望Go可以從涉及相同MyClass實例的多個線程中調用。 (現在我傾向於編寫類而不是以確保線程安全,但通常每個線程都有自己的一組對象來玩 - 所以我可能有一個包含Go的類的實例,以及MyClass的一個實例,但知道其他線程不應該使用相同的實例。)

+0

不是用'SomeMethod'來鎖定更多的關注,它是後續資源去'去'? – Smudge202

+0

@ Smudge202:這取決於 - 如果'MyClass'不聲稱是線程安全的,但包含'Go'的類確實,那麼鎖定應該在'Go'中。如果'MyClass.SomeMethod'是爲了線程安全的(爲了這個術語的適當含義......),那麼'Go'不需要鎖定。 –

+0

夠公平的。儘管如此,我仍然發現所有可怕的倒退,代表'SomeMethod'的'Go'方法中的資源被鎖定,這並不是線程安全的。個人喜好我猜。我也非常喜歡非線程安全的方式,並儘可能地確保線程的公寓/獨立實例。簡單得多。 – Smudge202

4

這取決於,如果SomeMethod是一個線程安全的方法,那麼你不需要鎖定。否則,您可能需要使用鎖定。

+0

我不認爲它是線程安全的! (這是一個正則表達式對象的匹配方法)。謝謝。 – Umair

+0

實際上,正則表達式對象上的匹配方法是線程安全的:http://msdn.microsoft.com/en-us/library/6h453d2h.aspx –

1

很難說某些沒有關於「變化狀態」的含義的更多信息,但總的來說,如果一個方法只是從字段中讀取你知道不會在其他線程中改變,你應該沒有鎖的罰款。

但是,如果您只依賴於readonly,那麼這還不夠好,因爲對象本身可能在來自不同線程的調用期間發生更改。

+0

我的觀點是myObj.SomeMethod將從不同的線程中調用,因此myObj.SomeMethod的參數會有所不同。 – Umair