2012-01-27 36 views
0

我的ASP.NET應用程序提供對各種數據塊的訪問。每個塊可以被一個或多個用戶同時訪問,所以應用程序必須防止衝突。如何最佳地實現鎖定隊列訪問特定部分的數據?

經過很多考慮,我認爲樂觀併發不是這種情況下的最佳解決方案,並且目前將鎖定視爲合適的選項。

我可以很容易地讓所有請求由一個處理一個用SyncLock如下:

私人共享AccessLock作爲新對象

SyncLock AccessLock 

..Do some reading and writing here 

End Synclock 

但是,這極大地限制了可擴展性應用。

所以我想在某種程度上排隊訪問數據的特定部分。例如。一個隊列用於訪問一部分數據,另一個隊列用於訪問另一部分數據。

有沒有一種方法可以自定義同步鎖定,以便爲數據的不同部分使用不同的隊列,而不僅僅是一個隊列?我的意思是它可以讓我手動指定類似「SyncLock(」Group1「)和」SyncLock(「Group2」)。

回答

0

有沒有一種方法可以自定義同步鎖定,爲數據的不同部分使用不同的隊列,而不僅僅是一個隊列?我的意思是它可以讓我手動指定類似「SyncLock(」Group1「)和」SyncLock(「Group2」)。

是的。您可以有兩個單獨的對象,並且「Group1」對象或「Group2」對象上有SyncLock

但是,我會重新考慮你的設計。您可能需要考慮讓一個或多個ConcurrentQueue(Of T)集合保存您的數據。這可能會讓多個線程在不鎖定的情況下訪問數據,同時保持線程安全。

+0

他們在線程安全的情況下如何同時訪問相同的數據? – usr 2012-01-27 21:47:18

+0

@usr它們可以使用相同的集合,因爲ConcurrentQueue本身就是線程安全的。不過,各個數據元素將由單獨的線程處理。共享數據(線程之間)需要同步。 – 2012-01-27 22:18:38

0

您可以將對象分成組,每個組都使用單獨的鎖保護。這被稱爲鎖條紋。

如果您需要一次訪問多個鎖,則需要始終以相同的順序獲取它們,否則會導致死鎖。