异步与并行~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");
            });

执行的结果

我们可以看到,共享锁在被访问时,几个线程是同时的;而互斥锁在使用时,则出现了线程之间的等待(阻塞)!

感谢各位的阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:异步与并行~ReaderWriterLockSlim实现的共享锁和互斥锁,如需转载请自行联系原博主。

目录
相关文章
|
缓存 测试技术 持续交付
docker desktop 搜索不到images
【2月更文挑战第23天】
3440 0
vscode将本地代码实时同步到服务器
vscode近些年变得越来越流行了,主要是IDEA用上去实在有点卡,机器卡崩溃几次,这段时间也想用vscode体验一下,在自己的一些项目上面,想实现像phpstorm或者goland那样直接把代码通过sftp传到服务器上面,那么怎么来做这个事情呢,经过一番研究,把方案整理下来。
1281 0
|
9月前
|
人工智能 固态存储 iOS开发
5分钟搞定Photoshop 2025安装:官方下载+许可证激活避坑指南
Adobe Photoshop 2025 是 Adobe 公司推出的最新图像处理软件,广泛应用于平面设计、摄影后期和 UI 设计等领域。其核心功能包括智能 AI 工具(一键抠图、生成填充等)、高效工作流(优化图层管理与色彩调整)、跨平台兼容(支持 Windows 11 和 macOS 15)以及云协作功能(与 Adobe Creative Cloud 集成)。本文详细介绍软件的安装流程、系统要求、正版激活方法及常见问题解决方案,并提供扩展学习资源,帮助用户更好地掌握这款强大工具。
32903 3
|
SQL 存储 关系型数据库
什么是MySQL Workbench
【10月更文挑战第17天】什么是MySQL Workbench
1299 0
|
数据采集 API 开发工具
项目支付接入支付宝【沙箱环境】
该博客文章详细介绍了如何在PC端项目中接入支付宝支付功能,特别是在沙箱环境中的配置和实现步骤。文章提供了详细的配置指南,包括获取支付宝公钥和私钥、配置沙箱应用环境、生成密钥、设置服务端代码以及调用支付接口等步骤,并附有相应的代码示例和说明。
项目支付接入支付宝【沙箱环境】
|
10月前
|
人工智能 IDE 程序员
与1.0 相比,通义灵码 2.0 AI 程序员有哪些功能、亮点、优势、场景?
通义灵码2.0相比1.0新增了工程级编码任务、单元测试生成和图片多模态问答等功能,支持多文件代码修改、批量生成单元测试及根据图片内容生成代码建议。亮点包括支持主流IDE、垂直智能体覆盖更多场景、企业级检索增强和灵活对话交互体验。技术优势涵盖多模态上下文感知、快速推理、企业数据个性化及一流代码生成效果。典型应用场景有新功能开发、跨语言编程、单元测试自动生成和错误排查修复。
1013 7
|
Kubernetes Docker Python
dockercompose与k8s的pod文件的爱恨情仇
dockercompose与k8s的pod文件的爱恨情仇
|
小程序 JavaScript Java
微信小程序+SpringBoot接入后台服务,接口数据来自后端
这篇文章介绍了如何将微信小程序与SpringBoot后端服务进行数据交互,包括后端接口的编写、小程序获取接口数据的方法,以及数据在小程序中的展示。同时,还涉及到了使用Vue搭建后台管理系统,方便数据的查看和管理。
微信小程序+SpringBoot接入后台服务,接口数据来自后端
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
2593 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
C++
使用 QML 类型系统注册 C++ 类型
使用 QML 类型系统注册 C++ 类型
494 0

热门文章

最新文章