.NET ReaderWriterLockSlim 问题

标签 .net multithreading thread-safety

有很多关于 ReaderWriterLockSlim 类的文章,它允许多次读取和一次写入。所有这些(至少我发现的)都告诉了如何使用它,而没有太多解释它为什么以及如何工作。标准代码示例是:

lock.EnterUpgradeableReadLock();

try
{
   if (test if write is required)
   {
      lock.EnterWriteLock();

      try
      {
          change the resourse here.
      }
      finally
      {
         lock.ExitWriteLock();
      }
   }
}
finally
{
   lock.ExitUpgradeableReadLock();
}

问题是:如果可升级锁只允许单个线程进入其部分,为什么我应该在其中调用 EnterWriteLock 方法?如果我不这样做会发生什么?或者,如果我调用 EnterWriteLock 而不是 EnterUpgradeableReadLock 并在根本不使用可升级锁的情况下写入资源,会发生什么?

最佳答案

使用 EnterUpgradeableReadLock 相对于 EnterReadLock 的好处是,您可以确定地知道您为了确定是否进入写锁定而检查的条件是否符合检查条件和实际进入写锁之间没有变化。这避免了常规可能需要的重复:

if (whatever-condition)
{
    lock (_lockObject)
    {
        // the condition may have changed betwen the check and the lock; verify
        // that the condition is still valid
        if (whatever-condition)
        {
            // do the stuff
        }
    }
}

同时,它不会阻止对EnterReadLock的调用,因此其他线程仍然可以在代码的其他部分获得读取访问权限(并且这些调用将,当然,阻止对 EnterWriteLock 的调用,直到它们释放读锁。

关于.NET ReaderWriterLockSlim 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2494104/

相关文章:

Java 多线程 - 有没有办法同步/锁定映射中的特定值以进行读取和写入?

c - 实现 'thread-safe"链表

scala - ConcurrentHashMap[String, AtomicInteger] 或 ConcurrentHashMap[String, Int] 用于线程安全计数器?

c# - .net 键枚举 ToString() 与 BackSlash 一起使用 '\'

c# - 我应该学习Java还是应该学习C++?

c# - 启动多进程并异步重定向输出

java - Java和数据库中的多线程

java - Spring 的 NumberFormat 线程安全

c# - 如何确定运行我的应用程序所需的最低 .NET Framework 版本

c# - 从 API 请求中删除 Arrafinity Cookie