有很多关于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,并在根本不使用可升级锁的情况下写入资源,会发生什么?
发布于 2010-03-23 01:02:51
使用EnterUpgradeableReadLock而不是EnterReadLock的好处是,您可以确定检查条件以确定是否进入写锁的条件在检查条件和实际进入写锁之间不会改变。这避免了常规lock可能需要的重复操作:
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的调用,直到它们释放读锁定)。
发布于 2010-03-23 01:00:23
如果可升级锁只允许一个线程进入它的段,为什么我要在里面调用EnterWriteLock方法?
EnterWriteLock会阻塞其他只需要读的线程--如果你使用一个可升级的锁,其他线程仍然可以获得读锁。从EnterUpgradableLock文档中:
在任何给定时间,只有一个线程可以进入可升级模式。如果线程处于可升级模式,并且没有线程等待进入写入模式,则任何数量的其他线程都可以进入读取模式,即使有线程等待进入可升级模式也是如此。
发布于 2010-03-23 00:54:56
ReaderWriterLockSlim类实际上包装了写锁,并允许所有读取器在写锁未持有的情况下进行读取。一旦持有写锁,任何读取器都不能读取。
EnterUpgradeableReadLock背后的想法只是允许程序员明确地声明他们的意图,而不是意外地修改内容。
pm100 -它的速度更快,因为锁不是独占的,因为可以同时读取多个线程,这可以加快读取繁重应用的速度。事实上,如果您的应用程序编写繁重,那么对于您来说,这可能不是最佳的锁定解决方案。当很少进行修改但需要多次读取时,这种方法效果最好。
https://stackoverflow.com/questions/2494104
复制相似问题