请解释主要区别是什么,何时应该使用什么 重点关注Web多线程应用程序。
答案 0 :(得分:61)
lock只允许一个线程同时执行代码。 ReaderWriterLock可能允许多个线程同时读取或具有写入的独占访问权限,因此它可能更有效。如果您使用.NET 3.5 ReaderWriterLockSlim甚至更快。因此,如果您的共享资源被更频繁地阅读而不是被编写,请使用ReaderWriterLockSlim
。使用它的一个很好的例子是你经常阅读的文件(在每个请求上),你很少更新文件的内容。因此,当您从文件中读取时,您输入一个读锁定,以便许多请求可以打开它进行读取,当您决定写入时,请输入写锁定。在文件上使用lock
基本上意味着您可以一次提供一个请求。
答案 1 :(得分:20)
如果您有许多线程,只考虑需要读取数据并且这些线程被阻塞等待锁定并且您不经常使用,请考虑使用ReaderWriterLock需要更改数据。
然而,ReaderWriterLock可能会阻塞等待写很长时间的线程。
因此,只有在确认 高争用后,才能使用ReaderWriterLock锁定“现实生活”并且您已确认可以不要将锁定设计重新设计为减少锁定的持续时间。
还要考虑是否不能将共享数据存储在数据库中并让它处理所有锁定,因为如果数据库速度很快,这很难让您很难跟踪错误足以满足您的申请。
在某些情况中,您也可以使用Aps.net缓存来处理共享数据,并在数据更改时从缓存中删除该项。下一次读取可以将新副本放入缓存中。
记住
“最好的锁定是 锁定你不需要(即不要 在线程之间共享数据。“
答案 2 :(得分:9)
监视和可以与任何引用对象相关联的底层“syncblock” - C#lock
下的底层机制 - 支持独占执行。只有一个线程可以拥有锁。这很简单有效。
ReaderWriterLock
(或者,在V3.5中,更好的ReaderWriterLockSlim
)提供更复杂的模型。 避免除非你知道它会更有效率(即有性能测量来支持你自己)。
最好的锁定类型是你不需要的锁定(即不要在线程之间共享数据)。
答案 3 :(得分:6)
ReaderWriterLock允许您让多个线程同时保存ReadLock ...这样您的共享数据就可以被多个线程同时使用。一旦请求WriteLock,就不再允许ReadLocks,等待WriteLock的代码被阻塞,直到所有带有ReadLocks的线程都释放它们。
WriteLock只能由一个线程持有,允许您的“数据更新”从代码消耗部分的角度看起来是原子的。
另一方面,Lock只允许一个线程一次进入,而不允许只是尝试使用共享数据的线程。
ReaderWriterLockSlim是一个新的更高性能的ReaderWriterLock版本,它更好地支持递归,并且能够让一个线程从一个基本上是一个ReadLock的Lock移动到WriteLock(UpgradeableReadLock)。
答案 4 :(得分:6)
ReaderWriterLock / Slim专门用于帮助您有效锁定多个消费者/单个制作人场景。使用lock语句可以这样做,但效率不高。 RWL / S通过积极地自旋锁获取锁来占上风。这也有助于你避免锁定车队,这是一个锁定语句的问题,当一个线程无法获取锁定时,线程放弃其线程量子,使其落后,因为它不会被重新安排一段时间。
答案 5 :(得分:2)
我建议查看http://www.albahari.com/threading/part4.aspx#_Reader_Writer_Locks。它讨论了ReaderWriterLockSlim(你想使用它而不是ReaderWriterLock)。
答案 6 :(得分:2)
ReaderWriterLockSlim确实比ReaderWriterLock更快。但是,ReaderWriterLockSlim的内存消耗完全是令人愤慨的。尝试连接内存分析器并亲自查看。我会在ReaderWriterLockSlim上选择ReaderWriterLock。