2011-06-29 41 views
2

假設你傳遞一個數組作爲參數傳遞給一個給定的方法,比方說,鎖定和驗證或鎖定?

public static DoSomething (string[] array) 
{ 
    // Do something with array here. 
} 

並且該方法中使用的一些指令將拋出一個異常,如果array包含無效數據。在多線程環境下,多線程可能正在訪問array,應該按照什麼順序進行?

1)鎖定陣列,以確保只有一個線程就可以同時操作,並且,鎖定後,驗證它,只要你完成工作釋放鎖;或

2)立即檢查數組的有效性,並在情況下,它是有效的,鎖定它,做你的工作。

+0

當然,如果所有的線程是*讀者* ,它可能是你不需要任何鎖; p –

+0

並且不要鎖定陣列本身。鎖定其他人知道的對象通常是一個壞主意。 – CodesInChaos

+1

@CodeInChaos你可能會說,這鎖沒* *人知道對象是有點兒毫無意義...... –

回答

5

不能鎖定「陣列」,如果它爲null;但無論如何無關緊要 - 參考不能改變;即使內容改變,它仍然是相同的參考。所以你可以推遲鎖定,直到你對的內容感興趣。

所以:

  • 空檢查
  • 檢查內容/應用內容

如果你的意思是一般的有效性 - 這取決於是否所有的線程要改變的內容。如果不是...... meh,則不需要鎖。如果他們改變的內容,你需要鎖定您驗證之前,否則你的驗證是沒有實際意義。

+0

謝謝馬克,你是對的!我已經編輯過這篇文章。 – User

2

我相信方法中的代碼並不需要鎖定作爲參數傳遞的項目。相反,來電者應該這樣做!

這是一個責任鏈的問題:訪問共享數據的對象(即類中的靜態字段)應該進行空值檢查和鎖定,並且應該對其輸入進行操作的方法不應考慮任何多線程問題,假設該論據完全由它使用。

這只是我的意見,所以

  • 空檢查
  • 鎖定
  • 調用方法
  • 解鎖回報
+1

假設你使用'lock(...)',最後一步是隱含的 –