2010-01-22 49 views

回答

46

lock只允許一個線程同時執行代碼。 ReaderWriterLock可能允許多個線程同時讀取或具有獨佔寫入權限,所以它可能更有效。如果你正在使用.NET 3.5 ReaderWriterLockSlim更快。因此,如果您的共享資源讀取次數多於寫入次數,請使用ReaderWriterLockSlim。使用它的一個很好的例子是您經常閱讀(每次請求)的文件,並且很少更新文件的內容。因此,當您從文件中讀取數據時,您輸入讀取鎖定,以便許多請求可以打開它進行讀取,當您決定寫入時,輸入寫入鎖定。在文件上使用lock基本上意味着您可以一次提供一個請求。

+1

所以你說的是,如果第一個線程讀取一個內部鎖的值,那麼其他線程不能在同一時間讀取它? – kenny 2010-01-22 11:53:45

+0

確切地說,'lock'只允許一個線程執行鎖語句的主體。 – 2010-01-22 11:54:32

+3

「所以它可能更有效」:但可能不會,你的代碼會更復雜。它應該保留給利基案件。 – Richard 2010-01-22 11:56:43

15

考慮使用ReaderWriterLock如果你有很多線程只有需要閱讀越來越阻塞等待鎖和數據和這些線程的,你不經常需要改變的數據。

但ReaderWriterLock可能會阻塞等待長時間寫入的線程。

因此只使用ReaderWriterLock你有後證實高爭在「現實生活」鎖和您確認您不能重新設計你的鎖定設計,減少鎖是多久持有

另外考慮如果你不能將共享數據存儲在數據庫中並讓它處理所有的鎖定,因爲這很難讓你很難追蹤到錯誤,如果數據庫是足夠快的爲您的應用程序。

某些情況下您也可以使用Aps.net緩存處理共享數據,並在數據更改時從緩存中刪除項目。下一次讀取可以在緩存中添加新的副本。

記住

「的最好的一種鎖定的是 鎖定你不需要(即在線程之間沒有 共享數據)。」

8

監視器和下面的「同步塊」可以與任何參考對象—下的C#lock —支持專屬執行基礎機制相關聯。只有一個線程可以擁有該鎖。這是簡單而有效的。

ReaderWriterLock(或者在V3.5中,更好的ReaderWriterLockSlim)提供了更復雜的模型。 避免,除非你知道它會更有效率(即有性能測量來支持自己)。

最好的一種鎖定是你不需要的鎖定(即不要在線程之間共享數據)。

+4

+1」最好的一種鎖定是你不需要的鎖定(即不要在線程之間共享數據)。「 – 2010-01-22 12:00:02

4

ReaderWriterLock允許你有多個線程在同一時間保持ReadLock ...以便您的共享數據可以被多個線程一次使用。只要WriteLock被請求,就不會再有ReadLock被授予,並且等待WriteLock的代碼被阻塞,直到所有帶有ReadLock的線程都釋放它們。

WriteLock只能由一個線程持有,允許您的「數據更新」從代碼的使用部分的角度看起來是原子的。

另一方面,Lock只允許一個線程一次進入,不允許只嘗試使用共享數據的線程。

ReaderWriterLockSlim是ReaderWriterLock的一個新的更高性能版本,它更好地支持遞歸,並且能夠讓線程從本質上是ReadLock的Lock平穩移動到WriteLock(UpgradeableReadLock)。

6

ReaderWriterLock/Slim專門設計用於幫助您高效地鎖定多用戶/單生產者場景。用lock語句這樣做是可能的,但效率不高。 RWL/S通過積極地螺旋鎖定獲得鎖定而佔據上風。這也可以幫助你避免鎖定車隊,這是鎖定語句的一個問題,當線程無法獲取鎖定時,它會放棄它的線程量,因爲它不會被重新安排一段時間,所以它會落後。

2

確實,ReaderWriterLockSlim比ReaderWriterLock更快。但ReaderWriterLockSlim的內存消耗是絕對不可接受的。嘗試附加內存分析器並親自查看。我會在ReaderWriterLockSlim的任何一天選擇ReaderWriterLock。