tnblog
首页
视频
资源
登录

.Net ReaderWriterLockSlim 锁

6288人阅读 2022/4/20 11:47 总访问:3467186 评论:0 收藏:0 手机
分类: .net后台框架

.netcore

.Net ReaderWriterLockSlim 锁


读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁。

  1. public class ReadWriteLockDemo
  2. {
  3. public static ReaderWriterLockSlim readerwritelock = new ReaderWriterLockSlim();
  4. public static long i =0;
  5. public void Read(long value)
  6. {
  7. readerwritelock.EnterReadLock();
  8. Thread.Sleep(5000);
  9. Debug.WriteLine($"Thread ID :{Thread.CurrentThread.ManagedThreadId} Read Lock Value:{i} Time:{DateTime.Now}");
  10. readerwritelock.ExitReadLock();
  11. }
  12. public void Write(long value)
  13. {
  14. readerwritelock.EnterWriteLock();
  15. Thread.Sleep(5000);
  16. i = value;
  17. Debug.WriteLine($"Thread ID :{Thread.CurrentThread.ManagedThreadId} Write Lock Value:{i} Time:{DateTime.Now}");
  18. readerwritelock.ExitWriteLock();
  19. }
  20. public void Read(long value,int millisecondsTimeout)
  21. {
  22. //三秒内没执行将会自动释放
  23. bool islock = readerwritelock.TryEnterReadLock(millisecondsTimeout);
  24. if (islock)
  25. {
  26. Thread.Sleep(5000);
  27. Debug.WriteLine($"Thread ID :{Thread.CurrentThread.ManagedThreadId} Read Lock Value:{i} Time:{DateTime.Now} IsLock:{islock}");
  28. readerwritelock.ExitReadLock();
  29. }
  30. }
  31. public void Write(long value, int millisecondsTimeout)
  32. {
  33. bool islock = readerwritelock.TryEnterWriteLock(millisecondsTimeout);
  34. if (islock)
  35. {
  36. Thread.Sleep(5000);
  37. i = value;
  38. Debug.WriteLine($"Thread ID :{Thread.CurrentThread.ManagedThreadId} Write Lock Value:{i} Time:{DateTime.Now} IsLock:{islock}");
  39. readerwritelock.ExitWriteLock();
  40. }
  41. }
  42. }

场景一


只要前面那个写入线程没有释放,每次写都需要阻塞(排队等)。(10个读写线程,每次处理需要花5秒)

  1. [Test]
  2. public void TestReadWriteLock()
  3. {
  4. ReadWriteLockDemo readWriteLockDemo = new ReadWriteLockDemo();
  5. List<Task> list = new List<Task>();
  6. for (int i = 0; i < 10; i++)
  7. {
  8. int a = i;
  9. Task task = new Task(() => {
  10. readWriteLockDemo.Write(a);
  11. readWriteLockDemo.Read(a);
  12. });
  13. task.Start();
  14. list.Add(task);
  15. }
  16. Task.WaitAll(list.ToArray());
  17. }

场景二


只要前面那个写入线程没有释放,它叫我和其他线程等它3秒钟,3秒等完了还是没处理完我们走了,3秒内处理完了轮到我了我就上,或者轮到其他线程那个线程上,我们走了。

  1. [Test]
  2. public void TestReadWriteLockTimeOut()
  3. {
  4. ReadWriteLockDemo readWriteLockDemo = new ReadWriteLockDemo();
  5. List<Task> list = new List<Task>();
  6. for (int i = 0; i < 10; i++)
  7. {
  8. int a = i;
  9. Task task = new Task(() => {
  10. readWriteLockDemo.Write(a,3000);
  11. readWriteLockDemo.Read(a, 3000);
  12. });
  13. task.Start();
  14. list.Add(task);
  15. }
  16. Task.WaitAll(list.ToArray());
  17. }


我们这里改改,我们不急可以等100秒.这样我们就都可以等到处理完成。

  1. readWriteLockDemo.Write(a,100000);


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

多线程、Lock、数据库实现队列

队列其元素以先进先出(Firstin,Firstout,FIFO)的方式来处理的集合。先放入队列中的元素会先读取。队列使用System.Collect...

c 的运用

锁的一般分类:乐观锁、悲观锁、共享锁、排它锁、互斥锁锁的对象为什么要是私有的只读的因为防止被修改C#中Monitor和Lock以...

Redis分布式

public static RedisClient Redis;static CommonService(){ Redis = new RedisClient();}public static dynamic RedisLock...

SVN与TortoiseSVN实战:文件加详解

本篇详解使用TortoiseSVN对文件进行加锁和解锁的技巧加锁与解锁的操作对于项目中的二进制文件,如图片、声音、动态库等不可...

SVN更新或提交时报错:工作副本 “..........” 已经定”的解决办法

出现这种错可能是因为最近改变太多或者从未更新一直是提交造成的原因,只需要右键”清理”(clear up)就可以了原文地址:htt...

ABP lock的使用

///&lt;summary&gt; ///位置与轨迹应用服务层 ///&lt;/summary&gt; publicclassPositionAndTrajectory:FinanceAppServic...

.net6 AsyncEx 异步

.Net6 AsyncEx[TOC] 简单来讲就是可以通过异步方式实现锁。安装&lt;PackageReference Include=&quot;Nito.AsyncEx&quot; V...

Dapr 分布式

Dapr 分布式锁[TOC] 分布式锁简介简单来讲:两个人做一件事情,同一时间内,我做的时候你不可以做,除非我没有在规定的时...

net core 使用redis 分布式

在电商项目中,必定会与订单打交道。订单中必定会涉及到扣库存,但是在高并发项目中,库存余量不能及时刷新,导致库存扣除...

mysql 查看死的表,死的情况,排查表的情况,排查卡死的表,卡死的进程

方法一1.查看当前数据库锁表的情况SELECT * FROM information_schema.INNODB_TRX; 2.杀掉查询结果中锁表的trx_mysql_threa...

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

cAPS.net 保存base64位格式的图片

publicvoidUpload() { //取出图片对应的base64位字符 stringimgBase=Request[&quot;imgBase&quot;]; //c#里边的base6...

Quartz.net实例动态改变周期调度。misfire、Cron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.net Windows服务发布、安装、卸载、监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

c、VB.net中全角半角转换方法

///&lt;summary&gt; ///转全角的函数(SBCcase) ///&lt;/summary&gt; ///&lt;paramname=&quot;input&quot;&gt;任意字符串...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术