Как оптимально реализовать блокировку, которая ставит в очередь доступ к определенной части данных?
Мое приложение ASP.NET обеспечивает доступ к различным фрагментам данных. Доступ к каждому чанку может осуществляться одним или несколькими пользователями одновременно, поэтому приложение должно предотвращать конфликты.
После долгих размышлений я думаю, что оптимистичный параллелизм - не лучшее решение для этого сценария, и в настоящее время рассматриваю блокировку как подходящий вариант.
Я могу легко заставить все запросы обрабатывать один за другим, используя SyncLock
следующее:
Закрытый общий доступ AccessLock как новый объект
SyncLock AccessLock ..Do some reading and writing here End Synclock
Но это сильно ограничивает масштабируемость приложения.
Так что я думаю о том, чтобы как-то поставить в очередь доступ только к определенным частям данных. Например, одна очередь предназначена для доступа к одной части данных, а другая очередь для другой части данных.
Есть ли способ настроить блокировку синхронизации, чтобы использовать разные очереди для разных частей данных вместо одной очереди для всего? Я имею в виду, что это может позволить мне вручную указать что-то вроде "SyncLock ("Group1") и"SyncLock ("Group2").
2 ответа
Есть ли способ настроить блокировку синхронизации, чтобы использовать разные очереди для разных частей данных вместо одной очереди для всего? Я имею в виду, что это может позволить мне вручную указать что-то вроде "SyncLock (" Group1 ") и" SyncLock ("Group2").
Да. Вы можете иметь два отдельных объекта, и SyncLock
на объекте "Group1" или "Group2".
Однако я бы переосмыслил ваш дизайн. Вы можете рассмотреть возможность иметь один или несколько ConcurrentQueue(Of T)
коллекции для хранения ваших данных. Это потенциально позволит нескольким потокам обращаться к данным без блокировок, оставаясь при этом безопасным для потоков.
Вы можете разбить свои объекты на группы, каждую из которых вы защищаете отдельным замком. Это называется чередованием замков.
Если вам нужно получить доступ более чем к одной блокировке одновременно, вам необходимо получить их всегда в том же порядке, иначе вы получите взаимоблокировки.