【问题标题】:How to optimally implement locking that queues access to specific part of data?如何以最佳方式实现对特定数据部分的访问排队的锁定?
【发布时间】:2012-01-27 21:34:29
【问题描述】:

我的 ASP.NET 应用程序提供对各种数据块的访问。每个块都可以被一个或多个用户同时访问,因此应用程序必须防止冲突。

经过深思熟虑,我认为乐观并发并不是这种情况下的最佳解决方案,目前将锁定视为一个合适的选择。

我可以通过使用SyncLock 轻松地使所有请求一一处理,如下所示:

私有共享访问锁作为新对象

 SyncLock AccessLock

 ..Do some reading and writing here

 End Synclock

但这极大地限制了应用程序的可扩展性。

所以我正在考虑以某种方式仅对特定数据部分的访问进行排队。例如。一个队列用于访问一部分数据,另一个队列用于访问另一部分数据。

有没有办法自定义同步锁定以对数据的不同部分使用不同的队列,而不是对所有内容只使用 1 个队列?我的意思是它可以让我手动指定诸如“SyncLock ("Group1") 和 "SyncLock ("Group2") 之类的内容。

【问题讨论】:

    标签: .net synchronization conflict synclock


    【解决方案1】:

    有没有办法自定义同步锁定以对数据的不同部分使用不同的队列,而不是对所有内容只使用 1 个队列?我的意思是它可以让我手动指定诸如“SyncLock ("Group1") 和 "SyncLock ("Group2") 之类的内容。

    是的。您可以有两个单独的对象,SyncLock 在“Group1”对象或“Group2”对象上。

    但是,我会重新考虑您的设计。您可能需要考虑使用一个或多个 ConcurrentQueue(Of T) 集合来保存您的数据。这将潜在地让多个线程在不使用锁的情况下访问数据,同时保持线程安全。

    【讨论】:

    • 他们如何在线程安全的同时访问相同的数据?
    • @usr 他们可以使用相同的集合,因为 ConcurrentQueue 本身是线程安全的。不过,各个数据元素将由各个线程处理。共享数据(线程之间)需要同步。
    【解决方案2】:

    您可以将您的对象分成组,每个组都使用单独的锁进行保护。这称为锁条带化。

    如果您需要一次访问多个锁,则需要始终以相同的顺序获取它们,否则您将遇到死锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多