请解释一下主要的区别,以及我应该在什么时候使用什么。
重点关注web多线程应用程序。
发布于 2010-01-22 19:51:01
lock只允许一个线程同时执行代码。ReaderWriterLock可能允许多个线程同时读取或独占访问写入,因此它可能更高效。如果你使用的是.NET 3.5,ReaderWriterLockSlim会更快。因此,如果您的共享资源被读取的次数多于写入的次数,请使用ReaderWriterLockSlim。使用它的一个很好的例子是您经常(在每次请求时)读取的文件,而您很少更新文件的内容。因此,当您从文件读取时,您将进入一个读锁,以便许多请求可以打开它进行读取,而当您决定写入时,您将进入一个写锁。在文件上使用lock基本上意味着您一次可以为一个请求提供服务。
发布于 2010-01-22 19:52:59
如果你有很多线程,只有需要读取数据,并且这些线程在等待锁的时候被阻塞,并且你不经常需要更改数据,那么可以考虑使用。
但是,ReaderWriterLock可能会阻塞等待写入很长时间的线程。
因此,只使用ReaderWriterLock后,你已经确认,你得到了高争用的锁在“现实生活”,你已经确认,你不能重新设计你的锁设计,以减少锁持有的时间为。
另外,如果您不能将共享数据存储在数据库中并让它负责所有的锁定,那么如果一个数据库对您的应用程序来说足够快,那么这就不太可能让您很难找到bug。
在某些情况下,您还可以使用Aps.net缓存来处理共享数据,并在数据发生更改时从缓存中删除该项。下一次读取可以在缓存中放入一个新的副本。
记住
“最好的锁定类型是您不需要的锁定(即不在线程之间共享数据)。”
发布于 2010-01-22 19:55:09
监视器和可以与任何引用对象关联的底层“同步块”-C#的lock-support独占执行下的底层机制。只有一个线程可以拥有锁。这是简单而有效的。
ReaderWriterLock (或者,在V3.5中,更好的ReaderWriterLockSlim)提供了更复杂的模型。避免这样做,除非你知道它会更有效率(例如,有性能测量来支持你自己)。
最好的锁定类型是您不需要的锁定(即不在线程之间共享数据)。
https://stackoverflow.com/questions/2116957
复制相似问题