详解.NET类库中的简易读写锁SmartRWLocker

开发 后端
我们在本文将介绍可复用.NET类库中的简易读写锁SmartRWLocker,该类基于ESbasic环境。

本文将详细介绍可复用.NET类库中的简易读写锁SmartRWLocker,该类读写锁的功能较.NET内置的lock关键字和ReaderWriterLock类要稍微丰富一些。

1.缘起:

对于需要进行线程同步的地方,我们经常用的就是.NET内置的lock关键字和ReaderWriterLock类。lock的功能相对简单,因为它不区分读写,也就是说如果都在lock块中,读线程都会阻塞另一个读线程,在很多读远远多于写的应用中,这会极大地折损性能。所以我们也经常需要使用读写分离的锁ReaderWriterLock,使用它,我们可以明确的指定是要获取“读”锁还是“写”锁。而且,当前的“读”线程是不会阻塞其它的“读”线程的。

lock的使用非常简洁,而ReaderWriterLock类的使用就要繁琐很多,比如像这样:

  1. private ReaderWriterLock readerWriterLock = new ReaderWriterLock();  
  2. public void Test()  
  3. {  
  4. try 
  5. {  
  6. this.readerWriterLock.AcquireWriterLock(-1);  
  7. // Do Something  
  8. }  
  9. finally 
  10. {  
  11. this.readerWriterLock.ReleaseWriterLock();  
  12. }  

于是,我设计了ESBasic.Threading.Synchronize.SmartRWLocker来简化ReaderWriterLock的使用,使得我们可以像使用lock一样来使用ReaderWriterLock。

2.适用场合:

在大多数使用ReaderWriterLock的地方都可以使用SmartRWLocker来代替,除非你需要使用某些ReaderWriterLock的特殊功能。SmartRWLocker适用于以下场合:

(1)需要使用读写分离的锁。

(2)不需要设置等待锁的超时时间,也就是无限期地等待锁。

(3)不需要升级/降级锁,如将读锁升级为写锁,或将写锁降级为读锁。

3.设计思想与实现

SmartRWLocker的类图如下:

SmartRWLocker的类图

我们看到SmartRWLocker内部就是借助ReaderWriterLock来实现锁的控制的。而SmartRWLocker只有一个Lock方法,参数是一个AccessMode枚举,表示调用者是希望获取读锁还是写锁,另外该方法返回一个LockingObject对象。LockingObject的生命周期很有意思,LockingObject对象产生的时候,就是获取锁的时刻,其被销毁的时候(Dispose方法),就是释放锁的时刻。所以LockingObject对象的生命周期就是占用锁的时间段。

IDisposable接口与using结合起来使用,会使得语法非常简单可读。我们可以这样来简洁地使用SmartRWLocker:

  1. private SmartRWLocker smartRWLocker = new SmartRWLocker();  
  2. public void Test2()  
  3. {  
  4. using(this.smartRWLocker.Lock(AccessMode.Write))  
  5. {  
  6. // Do Something  
  7. }  

这就非常类似lock的使用方式了。

最后,LastRequireReadTime和LastRequireWriteTime属性记录了最后一次获取读写锁的时间 -- 即从一个侧面记录了我们对目标资源最后一次进行读写的时间。

4. 使用时的注意事项

SmartRWLocker简化了ReaderWriterLock的使用,但是正如有得必有失,它也损失了一些ReaderWriterLock的功能,正如在适用场合中介绍的,使用SmartRWLocker无法设置获取锁的超时时间,也无法升级/降级锁的性质。幸运的是,大多数情况下,我们都用不到这些高级一点的特性,所以,SmartRWLocker还是有它存在的价值的。

如果你的应用需要使用SmartRWLocker不提供的特性,那只有转向使用ReaderWriterLock本身了。这也未必是个坏主意。

使用任何类型的锁的时候,你都需要注意锁的“粒度”的问题,即你的锁要锁住的范围有多大。粒度太大,会降低系统的并发;粒度太细,又会使得编程相当繁琐。所以在设计时需要进行权衡,为你的锁选择一个恰当的粒度是非常重要的。

5.扩展

原文标题:ESBasic 可复用的.NET类库(10) -- 简易的读写锁SmartRWLocker

链接:http://www.cnblogs.com/zhuweisky/archive/2009/10/10/1580354.html

【编辑推荐】

  1. .NET Framework详解之内存机制
  2. .NET内存映射文件原理、创建及进程通讯
  3. .NET内存管理的最佳实践
  4. .NET 4.0内存映射文件详解
  5. .NET真的不用管内存吗?从List﹤T﹥列表聊起

简易的读写锁SmartRWLocker暂时没有任何扩展。

责任编辑:彭凡 来源: 博客园
相关推荐

2009-10-21 11:07:32

VB.NET类库

2023-06-02 08:29:24

https://wwMutex

2010-10-08 18:41:06

VS2010.NET

2009-07-09 17:58:15

MyEclipse配置JDK类库源代码

2009-09-02 18:28:55

.NET框架ESBasic

2009-11-04 14:54:51

.NET类

2024-01-29 01:08:01

悲观锁递归锁读写锁

2023-03-10 15:45:03

Golang公平锁

2009-10-20 17:38:54

VB.NET Comp

2022-07-14 07:01:56

Eureka读锁线程

2009-05-21 13:25:50

.NETCountDownLa微软

2009-07-30 13:33:55

ASP.NET中的co

2015-11-03 09:24:12

Java读写锁分析

2011-08-18 13:44:42

Oracle悲观锁乐观锁

2010-01-08 14:56:18

VB.NET类定义

2010-01-05 17:16:28

.NET Framew

2009-03-09 17:30:42

.NET FramewXMLXmlReader

2022-03-29 10:52:08

MySQL数据库

2010-01-05 16:15:05

.NET Framew

2019-11-28 16:00:06

重入锁读写锁乐观锁
点赞
收藏

51CTO技术栈公众号