C# ReaderWriterLockSlim类

194deeb394ef79c310f9fc9ee17f2ffb.png

为了使锁定机制允许锁定多个读取器(而不是一个写入器)访问某个资源,可以使用 ReaderWriterLockSlim 类。这个类提供了一个锁定功能,如果没有写入器锁定资源,就允许多个读取器访问资源,但只能有一个写入器锁定该资源。

33e3a20cf100cf483e21d7435163d2a1.png

ReaderWriterLockSlim 类有阻塞或不阻塞的方法来获取读取锁,如阻塞的EnterReadLock() 和不阻塞的 TryEnterReadLock() 方法,还可以使用阻塞的EnterWriteLock() 和不阻塞的 TryEnterWriteLock() 方法获得写入锁定。如果任务先读取资源,之后写入资源,它就可以使用 EnterUpgradableReadLock() 或 TryEnterUpgradableReadLock() 方法获得可升级的读取锁定。有了这个锁定,就可以获得写入锁定,而不需要释放读取锁定。

bec12c13a9a1d5588a052f96b7363daa.png

这个类的几个属性提供了当前锁定的相关信息。如CurrentReadCount、WaitingReadCount、WaitingUpgradableReadCount 和 WaitingWriteCount。

dddbd9d2dbe1835967c258c82ab914d4.png

下面的示例程序创建了一个包含 6 项的集合和一个 ReaderWriterLockSlim() 对象。ReaderMethod() 方法获得一个读取锁定,读取列表中的所有项,并把它们写到控制台中。WriterMethod(0 方法试图获得一个写入锁定,以改变集合的所有值。在Main()方法中,启动6个任务,以调用 ReaderMethod()或WriterMethod()方法。

class Program
{private static List<int> _items = new List<int>() { 0,1,2,3,4,5}; private static ReaderWriterLockSlim _rwl =new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);public static void ReaderMethod(object reader)
{try{_rwl.EnterReadLock();For (int i = 0; i < _items.Count; i++){Console.WriteLine($"reader {reader}, loop: {i}, item: {_items[i]}"); Task.Delay(40).Wait();}}finally{_rwl.ExitReadLock();}}public static void WriterMethod(object writer)
{try{while (!_rwl.TryEnterWriteLock(50)){Console.WriteLine($"Writer {writer} waiting for the write lock"); Console.WriteLine($"current reader count:(_rwl.CurrentReadCount}");}Console.WriteLine($"Writer {writer) acquired the lock");for (int i = 0; i < _items.Count; i++){_items[i]++;Task.Delay(50).Wait();}Console.WriteLine($"Writer {writer} finished");}finally{_rwl.ExitWriteLock();}}static void Main()
{var taskFactory = new TaskFactory(TaskCreationOptions.LongRunning,TaskContinuationOptions.None); var tasks = new Task[6];tasks[0] = taskFactory.StartNew(WriterMethod, 1); tasks[1] = taskFactory.StartNew(ReaderMethod, 1);tasks[2] = taskFactory.StartNew(ReaderMethod, 2);tasks[3] = taskFactory.StartNew(WriterMethod, 2);tasks[4] = taskFactory.StartNew(ReaderMethod, 3); tasks[5] = taskFactory.StartNew(ReaderMethod, 4); Task.WaitAll(tasks);}}

4105b7e7ee0c41bda04a81e678892ac1.png

运行这个应用程序,可以看到第一个写入器先获得锁定。第二个写入器和所有的读取器需要等待。接着,读取器可以同时工作,而第二个写入器仍在等待资源。 

Writer 1 acquired the lock
Writer 2 waiting for the write lock 
current reader count: 0
Writer 2 waiting for the write lock 
current reader count: 0
Writer 2 waiting for the write lock 
current reader count: 0
Writer 2 waiting for the write lock 
current reader count: 0 
Writer 1 finished
reader 4, loop: 0,item: 1 
reader 1, loop: 0, item: 1
Writer 2 waiting for the write lock 
current reader count: 4
reader 2, loop: 0,item: 1 
reader 3, loop: 0, item: 1 
reader 4,loop: 1, item: 2 
reader 1, loop: 1, item: 2
reader 3, loop: 1,item: 2
reader 2, loop: 1, item: 2 
Writer 2 waiting for the write lock 
current reader count: 4
reader 4, loop: 2, item: 3 
reader l, loop: 2,item: 3
reader 2, loop: 2,item: 3 
reader 3, loop: 2, item: 3
Writer 2 waiting for the write lock 
current reader count: 4
reader 4, loop: 3, item: 4 
reader 1, loop: 3,item: 4
reader 2, loop: 3, item: 4 
reader 3, loop: 3, item: 4
reader 4, loop: 4, item: 5 
reader 1, loop: 4, item: 5
Writer 2 waiting for the write lock 
current reader count: 4
reader 2, loop: 4, item: 5
reader 3, loop: 4, item: 5 
reader 4, loop: 5, item: 6 
reader 1,loop: 5,item: 6
reader 2, loop: 5, item: 6
reader 3, loop: 5, item: 6
Writer 2 waiting for the write lock 
current reader count: 4
Writer 2 acquired the lock 
Writer 2 finished

1e3fd12b4f3a05d91ec8cd0f2a3773e2.png

bdb63dedcd6efa659a412846fb22f206.png

 微信公众号 

Dotnet讲堂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LOG4NET用法

log 4net组件下载:log4net.dll web.config配置如下&#xff1a; <?xml version"1.0" encoding"utf-8" ?> <configuration><configSections><section name"log4net" type"log4net.Config.Log4NetConfigurationSectio…

怎么计算信息完整度_德阳冻货运镖怎么计算费用

德阳冻货运镖怎么计算费用物流”一词我们并不陌生&#xff0c;它把小到零食玩具、大到家用电器&#xff0c;一一送到我们手中&#xff0c;但传统的物流运输模式只能满足部分物品的运输要求。随着人们的生活品质不断提高、消费不断升级。德阳冻货运镖怎么计算费用息平台的支撑&a…

AI+时代,谈谈产品经理对图像识别技术的阈值控制

产品满足用户的需求有一个阈值&#xff0c;产品值低于阈值用户会觉得了无生趣&#xff0c;即产品一般般&#xff0c;也即产品经理做了功能经理。产品值等于阈值产品功能基本满足了用户的需求&#xff0c;而只有产品经理驾驭了需求&#xff0c;把产品做成作品&#xff0c;产品值…

【亲身经验】如何在 6 个月内成为“微软 MVP”

前言很荣幸&#xff0c;在愚人节这天&#x1f601;&#xff0c;收到了获得“微软 MVP”奖项的通知&#xff1a;由于该奖项评选标准只涉及 2021 年所做的贡献&#xff0c;而我的贡献主要是公众号文章。因此以我从 2021/06 开始运营个人公众号算起&#xff0c;可以说&#xff0c;…

3500个常用汉字表_小学常用560个汉字笔画笔顺表,打印下来,小学六年慢慢练...

温馨提示公众号改版后很多孩子及家长朋友找不到我们了为了方便大家更快地找到我们获取更多学习工具和资料您可以按照下面的方式 星标或置顶我们☟ ☟ ☟小学阶段&#xff0c;字写得好很重要&#xff0c;笔顺写对了也很重要。写对笔顺有利于把字写得美观&#xff0c;考试时碰到笔…

SVN安装和使用总结

SVN简介&#xff1a; 为什么要使用SVN&#xff1f; 程序员在编写程序的过程中&#xff0c;每个程序员都会生成很多不同的版本&#xff0c;这就需要程序员有效的管理代码&#xff0c;在需要的时候可以迅速&#xff0c;准确取出相应的版本。 Subversion是什么&#xff1f; 它是一…

从部署 httpd 入手,理清 k8s 配置中的 containerPort、port、nodePort、targetPort

注&#xff1a;文中各种内网、公网 IP 仅为示例&#xff0c;不保证所有 IP 都可以访问&#xff0c;且你的环境中 IP 可能不同。背景在上一篇文章 自己搭建一个k8s环境 中&#xff0c;我们一顿操作猛如虎&#xff0c;搭建出了由 1 个 master 和 1 个 worker 节点组成的 k8s 集群…

360文件粉碎机_中山三乡资料文件销毁粉碎销毁资料文件公司一览表

中山三乡资料文件销毁粉碎销毁资料文件公司一览表安排搬运工作人员及运输车辆上门收取销毁物品&#xff0c;将需销毁的物品装上运输车辆&#xff0c;并进行拍照、车箱粘贴封条等工作。第五步&#xff1a;客户可安排工作人员&#xff0c;跟我公司销毁运输车辆一同前往我公司销毁…

Sonnedix收购意大利11.2MW光伏电站产品组合

2016年9月5日, 太阳能独立发电商Sonnedix宣布已经在意大利获得Trading Emissions 的11.2MW太阳能光伏电站产品组合&#xff0c;此交易预计将在2016年第四季度关闭。 该产品组合包括三个地面安装光伏电站: 阿布鲁佐的Basciano和Cupello、以及西西里岛的Librandello。 Sonnedix在…

oracle中行数少于1000,oracle中in的个数超过1000的解决办法

oracle中in的个数要是超过1000就会报错&#xff0c;那么我们可以把它拆成一节一节的&#xff1a;in(1,2) or in (3,4)StringUtils.defaultIfEmpty的命名空间是&#xff1a;import org.apache.commons.lang.StringUtils;private String getOracleSQLIn(List> ids, int count,…

Xamarin效果第十七篇之AR GIS

在前面几篇文章中简单玩耍了一下在线、离线加载高德地图和添加Mark;今天在原来的基础上再去玩玩AR GIS;来看看最终效果:1、先通过NuGet引用:Install-Package Esri.ArcGISRuntime.ARToolkit.Forms -Version 100.13.02、在AndroidManifest.xml中配置:<application android:lab…

maven 多项目搭建

参考http://www.cnblogs.com/xdp-gacl/p/3498271.html 。 1.什么是maven maven是基于项目对象模型(POM)&#xff0c;是跨平台的管理工具&#xff0c;主要服务于java平台的项目构建&#xff0c;依赖管理和项目信息管理。 2.maven的好处 Maven中使用约定&#xff0c;约定java源代…

rog live service是什么_双11手机怎么买?ROG游戏手机3“独一份”体验,值得剁手...

对于追求极致的手游党来说&#xff0c;手机设备性能的强悍极为重要&#xff0c;毕竟时刻影响着流畅性与游戏体验。纵观当下手机厂商推出的游戏手机来看&#xff0c;ROG游戏手机3可以说是目前性能最强的游戏手机&#xff0c;在下半年发布的多款旗舰均没能领先过ROG。这也证明了我…

SQL Server 2005将某些数据库行为设置为与指定的 SQL Server 版本兼容

语法 sp_dbcmptlevel [ [ dbname ] name ] [ , [ new_cmptlevel ] version ]参数 [ dbname ] name要为其更改兼容级别的数据库的名称。数据库名称必须符合标识符的规则。name 的数据类型为 sysname&#xff0c;默认值为 NULL。 [ new_cmptlevel ] version数据库要与之兼容的…

oracle 优化分组 sql语句,Oracle SQL语句之常见优化方法 五

0、低效SQL语句查询:SELECT b.sql_text, --SQL內容a.sid,a.serial#,a.status,a.machine, --哪台机器運行的SQLa.username, --用戶a.module, --運行方式a.action, --Responsibilityc.opname,c.target,c.message,c.sofar totalwork * 100, --工作執行了百分之多少c.elapsed_secon…

我将 20 年前开发的操作系统迁移到 .NET 6,竟然成功了!

作者 | Scott Hanselman译者 | 弯月早在2001年&#xff0c;我用C#为学校的一门300系列的操作系统课程编写了一个微型虚拟操作系统&#xff0c;后来在2002年将其移植到了VB.NET。这些都是在.NET Core出现之前的代码&#xff0c;基于Windows早期的.NET 1.1或2.0。五年前&#xff…

bzoj2132: 圈地计划

要分成两坨对吧。。 所以显然最小割 但是不兹辞啊。。 最小割是最小的啊 求最大费用怎么玩啊 那咱们就把所有费用都加起来&#xff0c;减掉一个最小的呗 但是两个属于不同集合的点贡献的价值是负的啊 网络流怎么跑负的啊 那咱就交换一下呗 原图是二分图啊&#xff0c;把另一部分…

BEVFormerV2 论文阅读

论文链接 BEVFormer v2: Adapting Modern Image Backbones to Bird’s-Eye-View Recognition via Perspective Supervision 0. Abstract 提出了一种新颖的 BEV 检测器&#xff0c;具有透视监督&#xff0c;收敛速度更快&#xff0c;更适合现代图像基础架构优先考虑通过引入透…

光磁记录实现数据冷存储

通过一定强度的短脉冲可以在掺杂了钴离子的钇铁石榴石的磁性层上记录数据。据开发商介绍&#xff0c;这种新颖的光学存储机制有可能成为一种通用的、节能型数据存储技术&#xff0c;并替代现有的存储技术&#xff0c;这源于该技术能够完成超低热度的快速磁盘读写过程&#xff0…