请说明主要区别是什么,何时应使用。
专注于Web多线程应用程序。
Answers:
锁只允许一个线程同时执行代码。ReaderWriterLock可能允许多个线程同时读取或具有独占访问权限以进行写入,因此它可能会更有效率。如果使用的是.NET 3.5,ReaderWriterLockSlim甚至更快。因此,如果您的共享资源被读取而不是被写入,请使用ReaderWriterLockSlim
。一个使用它的很好的例子是一个文件(您经常在每次请求时都阅读)并且很少更新文件的内容。因此,当您从文件中读取文件时,您将输入一个读取锁,以便许多请求可以打开该文件以进行读取;而当您决定写入文件时,则输入了写入锁。lock
在文件上使用基本上意味着您可以一次处理一个请求。
lock
将只允许一个线程执行锁语句的主体。
如果您有很多只需要读取数据的线程,而这些线程在等待锁时被阻塞,并且您通常不需要更改数据,请考虑使用ReaderWriterLock 。
但是,ReaderWriterLock可能会阻塞正在等待很长时间的线程。
因此,只有在确认您对“现实生活”中的锁有很高的争用并且确认不能重新设计锁设计以减少锁的持有时间之后,才使用ReaderWriterLock 。
还请考虑是否您不能宁愿将共享数据存储在数据库中并让其处理所有锁定,因为如果数据库对您的数据库足够快,这会使您很难跟踪错误。应用。
在某些情况下,您也许还可以使用Aps.net缓存来处理共享数据,并且只需在数据更改时从缓存中删除该项即可。下次读取可以将新副本放入缓存中。
记得
“最好的锁定类型是不需要的锁定(即,不要在线程之间共享数据)。”
ReaderWriterLock允许您让多个线程同时持有ReadLock ...,以便共享的数据可以一次被多个线程使用。一旦请求了WriteLock,就不再授予其他ReadLock,并且等待WriteLock的代码将被阻塞,直到所有具有ReadLocks的线程都释放了它们。
WriteLock只能由一个线程持有,从代码使用部分的角度来看,您的“数据更新”看起来像是原子的。
另一方面,“锁”仅一次允许一个线程进入,而不允许仅尝试使用共享数据的线程。
ReaderWriterLockSlim是ReaderWriterLock的更高性能的新版本,它具有更好的递归支持,并且能够使线程从本质上为ReadLock的锁平稳地移动到WriteLock(UpgradeableReadLock)。
的确,ReaderWriterLockSlim比ReaderWriterLock更快。但是ReaderWriterLockSlim的内存消耗是完全荒唐的。尝试连接内存分析器并亲自查看。我会每天都通过ReaderWriterLockSlim选择ReaderWriterLock。
我建议您浏览http://www.albahari.com/threading/part4.aspx#_Reader_Writer_Locks。它讨论了ReaderWriterLockSlim(您想使用它而不是ReaderWriterLock)。