2010-05-21 30 views
2

我有一個方法已被其他方法多次調用哈希數據。在該方法中,使用了一些鎖定語句。您能否讓我知道鎖定聲明是否耗費時間,以及改進它的最佳方法是什麼。C#中的「鎖定」語句耗時嗎?

P/S:我一直在尋找一種避免在這種方法中使用鎖定語句的方法。

回答

11

您的問題不會回答。這完全取決於鎖是否被爭用。

讓我這樣說:你問「進入浴室需要很長時間嗎?」 沒有告訴我們有多少人已經在使用它。如果沒有任何人符合,不會長久。如果通常有二十個人在等待進入,可能確實很長。

+0

我的情況是: - 如果未使用鎖定語句,則必須將參數傳遞給該方法。 - 鎖在某些情況下很少生效。在大多數情況下,鎖定語句不是必需的。但爲了線程安全,我們必須添加鎖定語句。 有什麼建議嗎? – 2010-05-21 23:34:28

+0

它出現了另一個問題:使用鎖定語句比將對象傳遞給方法更耗時? – 2010-05-21 23:39:20

+1

@markattwood:這裏唯一可以衡量硬件上代碼性能的人就是你。嘗試兩種方式,仔細衡量結果,然後你就會知道。 – 2010-05-22 03:32:46

6

鎖定語句本身不是非常耗時,但它可能會導致共享數據的爭用。

後續任務:如果您需要保護共享數據,請使用鎖定。正如this article所示,無鎖代碼很難正確執行。

1

鎖定語句本身實際上是一些創建和管理Monitor對象的語法糖。

這本身通常不會過度耗費資源,但如果您有多個讀取但沒有寫入多個線程的變量,則會成爲問題。在讀取完成之前,每次讀取都必須等待另一個讀取完成。在可能從多個線程獲取變量但未設置變量的情況下,您可能需要考慮使用ReaderWriterLockSlim對象來管理異步讀取和寫入。

+0

Monitor是一個靜態類,不會創建任何實例。但是一個額外的SyncBlock由CLR分配。 – 2010-05-22 09:28:25

1

你可能會發現這個article線程感興趣和相關。其中一個主張是「鎖定本身非常快速:假設沒有阻塞,通常在幾十納秒內獲得鎖定。」

+0

我將使用鎖定語句而不是參數 – 2010-05-21 23:44:43