翼度科技»论坛 编程开发 .net 查看内容

Lock、Monitor线程锁

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
Lock、Monitor线程锁

官网使用

https://learn.microsoft.com/zh-cn/dotnet/api/system.threading.monitor?view=net-8.0
一. Lock

1.1介绍

Lock关键字实际上是一个语法糖,它将Monitor对象进行封装,给object加上一个互斥锁,A进程进入此代码段时,会给object对象加上互斥锁,此时其他B进程进入此代码段时检查object对象是否有锁?如果有锁则继续等待A进程运行完该代码段并且解锁object对象之后,B进程才能够获取object对象为其加上锁,访问代码段。
lock 是 Monitor 的语法糖
1.2 示例

lock示例:
  1. private static object obj = new object();
  2. lock (obj)
  3. {
  4.     // 代码逻辑
  5. }
复制代码
二. Monitor

2.1 介绍

提供同步访问对象的机制。
2.2 示例

Monitor示例:
  1. private static object obj = new object();
  2. try
  3. {
  4.     Monitor.Enter(obj);
  5.     // 代码逻辑
  6. }
  7. catch(Exception ex)
  8. {
  9.    
  10. }
  11. finally
  12. {
  13.     Monitor.Exit(obj);
  14. }
复制代码
上面两段的代码是一样的意思
但我更喜欢Monitor的写法, 因为这样写可以更加灵活。
2.3 实例

环境: .net 7.0
在WebApi中使用Monitor
需求: 当一个线程进来是,挡住其他线程进来,只有当第一个线程执行完之后,其他线程才能进来。
  1. using Microsoft.AspNetCore.Mvc;
  2. using System.Runtime.CompilerServices;
  3. namespace blog.Api.Controller.LockingMechanism
  4. {
  5.     [ApiController]
  6.     [Route("[controller]/[action]")]
  7.     public class LockingMechanismController : ControllerBase
  8.     {
  9.         private static object obj = new object();
  10.         [HttpGet]
  11.         public JsonResult TestLock(string type)
  12.         {
  13.             //bool isGetLock = false;
  14.             //bool acquiredLock = false;
  15.             //object obj = new object();
  16.             string msg = "操作成功";
  17.             int code = 200;
  18.             bool acquiredLock = false;
  19.             try
  20.             {
  21.                 Monitor.TryEnter(obj, 500, ref acquiredLock);
  22.                 if (acquiredLock)
  23.                 {
  24.                     for (int i = 0; i < 10; i++)
  25.                     {
  26.                         Console.WriteLine("资源被锁定中");
  27.                         Thread.Sleep(1000);
  28.                     }
  29.                 }
  30.                 else
  31.                 {
  32.                     Console.WriteLine("锁还没有释放,请稍等");
  33.                     JsonResult json2 = new JsonResult(new
  34.                     {
  35.                         code = code,
  36.                         msg = "锁还没有释放,请稍等",
  37.                         type
  38.                     });
  39.                     //obj = new object();
  40.                     return json2;
  41.                 }
  42.             }
  43.             finally
  44.             {
  45.                 if (acquiredLock)
  46.                 {
  47.                     Monitor.Exit(obj);
  48.                 }
  49.                 Console.WriteLine("资源已释放!");
  50.             }
  51.             JsonResult json = new JsonResult(new
  52.             {
  53.                 code = code,
  54.                 msg = msg,
  55.                 type
  56.             });
  57.             return json;
  58.         }
  59.     }
  60. }
复制代码
执行如下图:


当线程1正在执行时,线程2返回锁没释放。


来源:https://www.cnblogs.com/zbfoot/archive/2023/12/20/17916707.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具