异步与并行~ReaderWriterLockSlim实现的共享锁和互斥锁
在System.Threading.Tasks命名空间下,使用ReaderWriterLockSlim对象来实现多线程并发时的锁管理,它比lock来说,性能更好,也并合理,我们都知道lock可以对代码块进行锁定,当多线程共同访问代码时,只能有一个线程去访问它,其它线程被阻塞,这对于写操作是必须的,但对于读操作来说,就有些浪费资源了,因为我们的读操作应该是共享的,多个线程可以现时去读它,这就引出了ReaderWriterLockSlim对象,用它来实现共享锁和互斥锁!
声明一个读写锁
private static ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();
EnterReadLock和ExitReadLock-共享锁
当一个线程使用共享锁时,其它线程同样了可以访问这个资源,共用这个锁对象
rwLock.EnterReadLock(); Console.WriteLine(DateTime.Now.ToLongTimeString() + "线程{0}读到了数据", Thread.CurrentThread.ManagedThreadId); Thread.Sleep(10000); rwLock.ExitReadLock();
EnterWriteLock和ExitWriteLock-互斥锁
当一个线程使用互斥锁时,其它线程将被阻塞,直到这个线程释放锁(ExitWriteLock)为止
rwLock.EnterWriteLock(); Console.WriteLine(DateTime.Now.ToLongTimeString() + "线程{0}写了数据{1}", Thread.CurrentThread.ManagedThreadId, res); Thread.Sleep(10000); rwLock.ExitWriteLock();
我们在测试时,可以模式多个并发的线程,去调用同一个加锁的代码,然后看一个它们执行的时间即可
//多线程的并行 Parallel.Invoke(() => { TestReadWrite("1"); }, () => { TestReadWrite("2"); }, () => { TestReadWrite("3"); });
执行的结果
我们可以看到,共享锁在被访问时,几个线程是同时的;而互斥锁在使用时,则出现了线程之间的等待(阻塞)!
感谢各位的阅读!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2014-10-08 缓存篇(Cache)~第二回 使用static静态成员实现服务器端缓存(导航面包屑)~续
2014-10-08 缓存篇(Cache)~第一回 使用static静态成员实现服务器端缓存(导航面包屑)
2012-10-08 分层中的~条件过滤~每个层对于“条件过滤”的职责