.NET Framework ReaderWriterLock类相关概念详解

开发 后端
.NET Framework ReaderWriterLock类在性能上并不是很强大,不过它的应用可以支持递归的实现。还有一点就是会造成内核对象的泄露等。

.NET Framework提供了一个非常好的开发环境,为开发人员带来了非常大的好处。在这里就先来了解一下有关.NET Framework ReaderWriterLock类的相关概念介绍。.NET Framework BCL 在 1.1 版本时,给我们提供了一个.NET Framework ReaderWriterLock类来面对此种情景。但是很遗憾,Microsoft 官方不推荐使用该类。Jeffrey Richter 也在他的《CLR via C#》一书中对它进行了严厉的批判。下面是该类不受欢迎的主要原因:#t#

性能

.NET Framework ReaderWriterLock类实在是太慢了。比如它的 AcquireReaderLock 方法比 Monitor 类的 Enter 方法要慢 5 倍左右,而等待争夺写锁甚至比 Monitor 类慢 6 倍。

策略

假如某个线程完成写入操作后,同时面临读线程和写线程等待处理。ReaderWriterLock 会优先释放读线程,而让写线程继续等待。但我们使用读写锁是因为存在大量的读线程和非常少的写线程,这样写线程很可能必须长时间地等待,造成写线程饥饿,不能及时更新数据。更槽糕的情况是,假如写线程一直等待,就会造成活锁。反之,我们让 ReaderWriterLock 采取写线程优先的策略。如果存在多个写线程,而读线程数量稀少,也会造成读线程饥饿。幸运的是,现实实践中,这种情况很少出现。一旦发生这种情况,我们可以采取互斥锁的办法。

递归

.NET Framework ReaderWriterLock类支持锁递归。这就意味着该锁清楚的知道目前哪个线程拥有它。假如拥有该锁的线程递归尝试获得该读写锁,递归算法允许该线程获得该读写锁,并且增加获得该锁的计数。然而该线程必须释放该锁相同的次数以便线程不再拥有该锁。尽管这看起来是个很好的特性,但是实现这个“特性”代价太高。首先,因为多个读线程可以同时拥有该读写锁,这必须让该锁为每个线程保持计数。

此外,还需要额外的内存空间和时间来更新计数。这个特性对 ReaderWriterLock 类可怜的性能贡献极大。其次,有些良好的设计需要一个线程在此处获得该锁,然后在别处释放该锁(比如 .NET 的异步编程架构)。因为这个递归特性,ReaderWriterLock 不支持这种编程架构。

资源泄漏

在 .NET 2.0 之前的版本中, ReaderWriterLock 类会造成内核对象泄露。这些对象只有在进程终止后才能再次回收。幸运的是,.NET 2.0 修正了这个 Bug 。
此外,ReaderWriterLock 还有个令人担心的危险的非原子性操作。它就是 UpgradeToWriteLock 方法。这个方法实际上在更新到写锁前先释放了读锁。这就让其他线程有机会在此期间乘虚而入,从而获得读写锁且改变状态。如果先更新到写锁,然后释放读锁。假如两个线程同时更新将会导致另外一个线程死锁。

所以 Microsoft 决定构建一个新类来一次性解决上述所有问题,这就是 ReaderWriterLockSlim 类。本来可以在原有的.NET Framework ReaderWriterLock类上修正错误,但是考虑到兼容性和已存在的 API ,Microsoft 放弃了这种做法。当然也可以标记 ReaderWriterLock 类为 Obsolete,但是由于某些原因,这个类还有存在的必要。

责任编辑:曹凯 来源: 博客园
相关推荐

2010-01-06 19:22:43

.NET Framew

2010-01-05 10:29:43

.NET Framew

2010-01-05 16:31:45

.NET Framew

2010-01-05 14:04:53

.NET Framew

2010-01-06 18:21:24

2010-01-05 18:09:07

.NET Framew

2010-01-05 14:45:58

.NET Framew

2010-01-06 10:23:47

.NET Framew

2010-01-05 15:43:13

.NET Framew

2010-01-08 14:56:18

VB.NET类定义

2010-01-07 11:28:44

VB.NET Hash

2009-08-25 18:16:02

.NET Framew.NET Framew

2010-01-06 18:27:06

.Net Framew

2010-01-06 16:45:42

.Net Framew

2010-01-06 17:02:28

.Net Framew

2010-01-05 16:20:46

.NET Framew

2010-01-05 09:35:07

.Net Framew

2009-07-09 09:28:19

.Net Micro

2009-08-26 14:52:19

.NET Framew

2012-01-09 16:00:56

点赞
收藏

51CTO技术栈公众号