在.net中,还可以使用Monitor实现线程并发同步。Monitor类是纯托管且完全可移植,并且可能会在操作系统资源需求方面更加高效。

Monitor的锁对象尽可能使用引用对象,如果是字符串或值对象,会出现引发SynchronizationLockException异常。

其实我们日常用的lock锁同步,其原理就是基于Monitor的。

即:

public static readonly object locker=new object();
lock(locker){
//to do something
}

和以下代码是一样的意思:

public static readonly object locker=new object();
try{
Monitor.Enter(locker); //to do something
}finally{
Monitor.Exit(locker);
}

以下是基于测试的代码:

        protected static readonly object _locker = new object();
[HttpGet("[controller]/api/[action]")]
public IActionResult Test()
{
int threadId = Thread.CurrentThread.ManagedThreadId;
ResponseModel rc = new ResponseModel(, $"{threadId} 初始化"); try
{
//独占资源锁
Monitor.Enter(_locker); int count = RedisHelper.GetAsync(RTestKey).Result.ToInt32();
if (count > )
{
if (RedisHelper.SetAsync(RTestKey, "-1").Result)
rc.SetMessage($"{threadId} 设置成功!");
}
else rc.SetMessage($"{threadId} 已被设置,不能再次设置!");
}
catch (Exception ex)
{
_log.Error(ex);
}
finally
{
//释放锁,让其他线程获取锁并进入该方法
Monitor.Exit(_locker);
} return Json(rc);
}

接下来通过测试程序连续发送8次请求,看看结果:

通过以上操作,证明可以使用Monitor实现多线程的并发同步操作。

如果在执行了Monitor.Enter(locker)之后,需要释放锁对象并阻塞当前线程,让其他线程获取锁并执行的话,可以使用Monitor.Wait()方法。Monitor.Wait()方法的作用就是释放当前线程持有的锁,让当前线程进入等待队列,让其他某个线程获取锁对象并进入就绪状态并执行。其他线程执行Monitor.Pulse或PulseAll方法之后,当前等待的线程就可以继续获取锁并进入就绪队列去执行。

Monitor的Wait、Pulse和PulseAll方法必须在Enter和Exit方法之间调用。

如下测试代码:

        static void Func1() {
Monitor.Enter(_locker);
for(int i = ; i < ; i++)
{
Console.Write($"=>Func1【{i}】");
Monitor.Pulse(_locker);
Monitor.Wait(_locker);
} Monitor.Exit(_locker);
} static void Func2()
{
Monitor.Enter(_locker);
for (int i = ; i < ; i++)
{
Monitor.Wait(_locker);
Console.Write($"=>Func2【{i}】");
Monitor.Pulse(_locker);
} Monitor.Exit(_locker);
} static void Func4() {
List<Task> list = new List<Task>{
Task.Factory.StartNew(Func1),
Task.Factory.StartNew(Func2)
}; Task.WaitAll(list.ToArray());
} public static readonly object _locker = new object();
static void Main(string[] args)
{
Func4();
}

这段代码的目的是Fun1函数执行一次后,Fun2函数再执行一次,依次循环。让我们看看执行的结果:

由此看来,达到了本次测试的目的。

.net core WebApi Monitor实现并发同步的更多相关文章

  1. .net core WebApi ManualResetEvent实现并发同步

    ManualResetEvent,即手动重置事件,通过信号量来判别当前线程是否应该阻塞或继续执行.使用方式与ManualResetEventSlim差不多,ManualResetEventSlim只是 ...

  2. .net core WebApi Mutex实现并发同步

    Mutex,中文译为互斥体,在.net中也是作为一种线程或进程之间的互斥体存在.即在同一时刻,一个共享资源只允许被某一个线程或进程访问,其他线程或进程需要等待(直至获取互斥锁为止). Mutex的使用 ...

  3. .Net Core WebAPI 基于Task的同步&异步编程快速入门

    .Net Core WebAPI 基于Task的同步&异步编程快速入门 Task.Result async & await 总结 并行任务(Task)以及基于Task的异步编程(asy ...

  4. Net Core WebAPI

    Net Core WebAPI .Net Core WebAPI 基于Task的同步&异步编程快速入门 Task.Result async & await 总结 并行任务(Task)以 ...

  5. .net core WebApi Interlocked配合ManualResetEventSlim实现并发同步

    由于项目有某种需求,在WebApi中,有大量的请求需要操作相同的数据,因此需要用到并发同步机制去操作共享的数据. 本次配合使用Interlocked和ManualResetEventSlim来实现并发 ...

  6. 探索 Java 同步机制[Monitor Object 并发模式在 Java 同步机制中的实现]

    探索 Java 同步机制[Monitor Object 并发模式在 Java 同步机制中的实现] https://www.ibm.com/developerworks/cn/java/j-lo-syn ...

  7. net core WebApi——文件分片下载

    目录 前言 开始 测试 小结 @ 前言 上一篇net core WebApi--文件分片上传与跨域请求处理介绍完文件的上传操作,本来是打算紧接着写文件下载,中间让形形色色的事给耽误的,今天还是抽个空整 ...

  8. ASP.NET Core WebAPI控制器返回类型的最佳选项

    前言 从.NET Core 2.1版开始,到目前为止,控制器操作可以返回三种类型的WebApi响应.这三种类型都有自己的优点和缺点,但都缺乏满足REST和高可测性的选项. ASP.NET Core中可 ...

  9. ASP.NET Core WebApi使用Swagger生成api说明文档

    1. Swagger是什么? Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件 ...

随机推荐

  1. 运行pytorch代码遇到的error解决办法

    1.no CUDA-capable device is detected 首先考虑的是cuda的驱动问题,查看gpu显示是否正常,然后更新最新的cuda驱动: 第二个考虑的是cuda设备的默认参数是否 ...

  2. windows程序设计 显示一个窗口

    #include <windows.h> HINSTANCE hinst; LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM) ...

  3. DevOps“五宗罪”,这样向DevOps过渡注定会失败

    云计算提供的速度响应.敏捷性和规模效应,契合了如今不断变化的数字商业环境.企业基于最新的IT技术,重构IT架构,加速产品创新和服务交付的速度,从而提高运营效率和市场占有. 不过,企业IT管理者在利用云 ...

  4. Gis数据处理

    几何投影和解析投影几何投影是将椭球面上的经纬线网投影到几何平面上,然后将几何面展为平面.几何投影可以分为方位投影.圆柱投影和圆锥投影.这三种投影纬线的形状不同.方位投影纬线的形状是同心圆:圆柱投影纬线 ...

  5. 给学习立个flag

    今天是2018年7月7号,此时的砖相比昨天格外烫手,望着手套因被磨破而露出来的半截手指头,一股股热浪溜溜的从指间划过,背后还有小山一样高的砖头,感觉对面today店里的冰镇西瓜又成了不可奢望的梦... ...

  6. request.getParameter()获取不到数据

    HTML中的form表单有一个关键属性 Content-Type=application/x-www-form-urlencoded 或multipart/form-data. 1. Content- ...

  7. windows安装composer总结

    1.直接去网吧下载windows安装EXE程序,傻瓜式安装,so easy. 2.通过命令行安装,可以直接在php目录跑起来 php -r "readfile('https://getcom ...

  8. js 清空html input file的值

    在做上传图片预览时,利用input onchange事件触发函数,但是type=file时,一定记得新建要清空原来的图片,因为原来的图片还存在在input里面,再选重复的图片没有change,故不会触 ...

  9. Node.js基础学习一之Get请求

    本人从事的是前端开发,这段时间公司开发项目比较少所以就想着学点东西,然后就想到了Node.js ,跟着菜鸟教程学了点,不过我觉得最好的学习方法是带着需求来学习. 其实和服务端打交道无非就是能有一个可以 ...

  10. json转数组

    - (NSDictionary *)dataArrayFromJson { NSString *filePath = [[NSBundle mainBundle] pathForResource:@& ...