ReaderWriterLock vs lock {}
请解释什么是主要区别,什么时候应该使用什么。
关注Webmultithreading应用程序。
锁只允许一个线程同时执行代码。 ReaderWriterLock可能允许多个线程在同一时间读取或独占访问写入,所以它可能更有效率。 如果您使用.NET 3.5, ReaderWriterLockSlim更快。 因此,如果您的共享资源被读取的频率比写入的要多,请使用ReaderWriterLockSlim
。 使用它的一个很好的例子是你经常阅读的文件(在每个请求上),你很less更新文件的内容。 所以当你从文件读取时,你input一个读锁,这样许多请求就可以打开它进行读取,当你决定写入时,你input一个写锁。 对文件使用lock
基本上意味着您可以一次处理一个请求。
考虑使用ReaderWriterLock,如果你有很多只需要读取数据 的线程 ,而且这些线程被阻塞,等待locking,并且你不经常需要更改数据。
但是,ReaderWriterLock可能会阻塞正在等待长时间写入的线程。
因此,只有在确认了“ 真实生活 ”中的锁之后才使用ReaderWriterLock,并且确认不能重新deviselockingdevise,以减less锁的持续时间 。
另外考虑一下,如果你不能将共享数据存储在数据库中并让它处理所有的locking,因为如果数据库对于你来说是足够快的,那么很难让你很难追踪错误应用。
在某些情况下,您也可以使用Aps.netcaching处理共享数据,并在数据更改时从caching中删除项目。 下一次读取可以将新鲜的副本放入caching中。
记得
“最好的locking是你不需要的locking(即不要在线程之间共享数据)”。
监视器和底层的“同步块”,可以与任何引用对象相关联 – C#的lock
– 支持独占执行的底层机制。 只有一个线程可以locking。 这是简单而高效的。
ReaderWriterLock
(或V3.5中更好的ReaderWriterLockSlim
)提供了一个更复杂的模型。 避免,除非你知道它会更有效率(即有性能测量来支持自己)。
最好的locking是你不需要的locking(即不要在线程之间共享数据)。
ReaderWriterLock / Slim专门devise用于帮助您高效地locking多个消费者/单一生产者场景。 这样做与locking声明是可能的,但效率不高。 RWL / S通过积极地螺旋锁取得locking而占据上风。 这也可以帮助你避免锁车队,一个线程在无法获取锁的情况下放弃线程的锁语句的问题,因为它不会被重新安排一段时间。
ReaderWriterLock允许您同时拥有多个线程来保存ReadLock …因此您的共享数据可以被多个线程同时使用。 只要WriteLock被请求,就不会有更多的ReadLock被授予,并且等待WriteLock的代码被阻塞,直到所有带有ReadLock的线程都释放它们。
WriteLock只能由一个线程持有,允许你的“数据更新”从代码的消费部分的angular度看起来是primefaces的。
另一方面,Lock只允许一个线程一次进入,而不允许只尝试使用共享数据的线程。
ReaderWriterLockSlim是ReaderWriterLock的一个新的更高性能的版本,它具有对recursion的更好的支持,并且能够让一个线程从本质上是ReadLock的Lock平稳移动到WriteLock(UpgradeableReadLock)。
ReaderWriterLockSlim确实比ReaderWriterLock更快。 但是ReaderWriterLockSlim的内存消耗是非常大的。 尝试附加一个内存分析器,看看自己。 我会随时通过ReaderWriterLockSlimselectReaderWriterLock。
我会build议寻找,虽然http://www.albahari.com/threading/ – 第三部分谈到ReaderWriterLockSlim(你想使用,而不是ReaderWriterLock)。