我发现我的应用程序可能会变慢,因此我有两个问题:

  • 简单锁定对象和读取器/写入器锁之间的真正区别是什么?
    例如。我有很多客户,这些客户变化很快。对于迭代,我应该使用readerlock还是简单的锁就足够了?
  • 为了减少负载,我对一个集合进行了迭代(仅读取),没有任何锁定。该集合经常且快速地更改,但是使用writerlocks添加和删除了项目。将这个读数放在不带锁的状态下是否安全(我不介意偶尔跳过的项目,此方法循环运行并且并不重要)?我只是不想有随机的异常(exception)。
  • 最佳答案

    不,您当前的情况并不安全。

    特别是,如果集合在迭代时发生更改,则在迭代线程中将获得InvalidOperationException。您应该在迭代器的整个过程中获得阅读器锁:

  • 获取阅读器锁
  • 遍历集合
  • 释放阅读器锁

  • 请注意,这与为迭代的每个步骤获取读取器锁不同-这无济于事。

    至于读取器/写入器锁和“普通”锁之间的区别-读取器/写入器锁的想法是,多个线程可以同时读取,但是只有一个线程可以写入(并且仅当没有一个在读取时) 。在某些情况下,这可以提高性能-但也会增加解决方案的复杂性(就正确性而言)。我还建议您尽可能使用.NET 3.5中的ReaderWriterLockSlim-它比原始ReaderWriterLock效率更高,而且ReaderWriterLock IIRC存在一些固有的问题。

    我个人通常使用简单的锁,直到我证明锁争用是性能瓶颈。您是否已对应用程序进行了概要分析,以找出瓶颈所在?

    10-04 21:07