NET 多线程同步方法:读写锁(ReadWriteLock)
来源:互联网 发布:魔镜发型软件 编辑:程序博客网 时间:2024/06/05 18:17
读写锁的出现主要是在很多情况下,我们读资源的操作要多于写资源的操作。但是如果每次只对资源赋予一个线程的访问权限显然是低效的,读写锁的优势是同时可以有多个线程对同一资源进行读操作。因此在读操作比写操作多很多,并且写操作的时间很短的情况下使用读写锁是比较有效率的。
读写锁是一个非静态类所以你在使用前需要先声明一个读写锁对象:
static private ReaderWriterLock _rwlock = new ReaderWriterLock();
读写锁是通过调用AcquireReaderLock,ReleaseReaderLock,AcquireWriterLock,ReleaseWriterLock来完成读锁和写锁控制的。
static public void ReaderThread(int thrdId) { try { // 请求读锁,如果100ms超时退出 _rwlock.AcquireReaderLock(10); try { int inx = _rand.Next(_list.Count); if (inx < _list.Count) Console.WriteLine("{0}thread {1}", thrdId, _list[inx]); } finally { _rwlock.ReleaseReaderLock(); } } catch (ApplicationException) // 如果请求读锁失败 { Console.WriteLine("{0}thread get reader lock out time!", thrdId); } } static public void WriterThread() { try { // 请求写锁 _rwlock.AcquireWriterLock(100); try { string val = _rand.Next(200).ToString(); _list.Add(val); // 写入资源 Console.WriteLine("writer thread has written {0}", val); } finally { // 释放写锁 _rwlock.ReleaseWriterLock(); } } catch (ApplicationException) { Console.WriteLine("Get writer thread lock out time!"); } }
如果你想在读的时候插入写操作请使用UpgradeToWriterLock和DowngradeFromWriterLock来进行操作,而不是释放读锁。
static private void UpgradeAndDowngrade(int thrdId) { try { _rwlock.AcquireReaderLock(10); try { try { // 提升读锁到写锁 LockCookie lc = _rwlock.UpgradeToWriterLock(100); try { string val = _rand.Next(500).ToString(); _list.Add(val); Console.WriteLine("Upgrade Thread{0} add {1}", thrdId, val); } finally { // 下降写锁 _rwlock.DowngradeFromWriterLock(ref lc); } } catch (ApplicationException) { Console.WriteLine("{0}thread upgrade reader lock failed!", thrdId); } } finally { // 释放原来的读锁 _rwlock.ReleaseReaderLock(); } } catch (ApplicationException) { Console.WriteLine("{0}thread get reader lock out time!", thrdId); } }
这里有一点要注意的就是读锁和写锁的超时等待时间间隔的设置。通常情况下设置写锁的等待超时要比读锁的长,否则会经常发生写锁等待失败的情况。
参见:http://blog.0734link.com/Article/656.aspx
- NET 多线程同步方法:读写锁(ReadWriteLock)
- NET多线程同步方法详解(三):读写锁(ReadWriteLock)
- NET多线程同步方法详解(三):读写锁(ReadWriteLock) 收藏
- NET多线程同步方法详解(三):读写锁(ReadWriteLock)
- 【Java多线程】-读写锁ReadWriteLock
- 多线程 - 显式锁-读写锁ReadWriteLock
- java多线程学习二Lock(锁)读写锁(ReadWriteLock)
- 显式锁(三) -- 读写锁ReadWriteLock
- 多线程之Lock锁和读写锁ReadWriteLock
- 多线程(三):锁(Lock) 读写锁()ReadWriteLock (synchronized)
- 线程ReadWriteLock 读写锁
- JDK5 读写锁 ReadWriteLock
- 读写锁ReadWriteLock
- java 读写锁 ReadWriteLock
- # 读写锁类ReadWriteLock #
- 读写锁ReadWriteLock
- ReadWriteLock : 读写锁
- 读写锁ReadWriteLock
- Magento 后台删除产品时同时删除产品图
- C语言文件操作
- java 动态代理 和 cglib代理
- Net应该学什么怎么学(一、二、三、四)
- nginx学习总结四(nginx+php-cgi)
- NET 多线程同步方法:读写锁(ReadWriteLock)
- FFmpeg
- Android 开发中使用 SQLite 数据库
- 关于手机刷机的基础知识
- 解决win7无关机、重启选项
- 程序员开发大型应用程序的技巧
- 【转载】CrystalReport for vs2010 水晶报表的发布问题以及捆绑发布 .
- 文件流操作
- 10经典语录