有很多关于 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/