首页 > 其他分享 >Lock、Monitor线程锁

Lock、Monitor线程锁

时间:2023-12-20 16:11:29浏览次数:32  
标签:code obj Monitor Lock object 线程 new

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示例:

private static object obj = new object();
lock (obj)
{
    // 代码逻辑
}

二. Monitor

2.1 介绍

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

2.2 示例

Monitor示例:

private static object obj = new object();
try
{
    Monitor.Enter(obj);
    // 代码逻辑
}
catch(Exception ex)
{
    
}
finally
{
    Monitor.Exit(obj);
}

上面两段的代码是一样的意思
但我更喜欢Monitor的写法, 因为这样写可以更加灵活。

2.3 实例

环境: .net 7.0
WebApi中使用Monitor
需求: 当一个线程进来是,挡住其他线程进来,只有当第一个线程执行完之后,其他线程才能进来。

using Microsoft.AspNetCore.Mvc;
using System.Runtime.CompilerServices;

namespace blog.Api.Controller.LockingMechanism
{
    [ApiController]
    [Route("[controller]/[action]")]
    public class LockingMechanismController : ControllerBase
    {
        private static object obj = new object();
        [HttpGet]
        public JsonResult TestLock(string type)
        {

            //bool isGetLock = false;
            //bool acquiredLock = false;
            //object obj = new object();

            string msg = "操作成功";
            int code = 200;

            bool acquiredLock = false;

            try
            {
                Monitor.TryEnter(obj, 500, ref acquiredLock);
                if (acquiredLock)
                {
                    for (int i = 0; i < 10; i++)
                    {
                        Console.WriteLine("资源被锁定中");
                        Thread.Sleep(1000);
                    }
                }
                else
                {
                    Console.WriteLine("锁还没有释放,请稍等");
                    JsonResult json2 = new JsonResult(new
                    {
                        code = code,
                        msg = "锁还没有释放,请稍等",
                        type
                    });
                    //obj = new object();
                    return json2;
                }
            }
            finally
            {
                if (acquiredLock)
                {
                    Monitor.Exit(obj);
                }
                Console.WriteLine("资源已释放!");
            }

            JsonResult json = new JsonResult(new
            {
                code = code,
                msg = msg,
                type
            });
            return json;
        }
    }
}

执行如下图:

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

标签:code,obj,Monitor,Lock,object,线程,new
From: https://www.cnblogs.com/zbfoot/p/17916707.html

相关文章

  • Java线程池使用浅谈
    1. 线程池相关基本概念任务(Task):任务是线程池中要执行的工作单元。任务可以是实现了 Runnable 接口或 Callable 接口的对象。Runnable 任务没有返回值,而 Callable 任务可以返回一个结果。线程池管理器(ThreadPoolManager):线程池管理器是用于创建和管理线程池的组件。......
  • 【HTB】Sherlocks Tracer 蓝队 easy
    .pf文件:windows预读取文件.evtx文件:日志文件$Extend:USN日志MFTECmd下载:https://ericzimmerman.github.io/#!index.mdEventLogExplorer下载:https://eventlogxp.com/download.php?s=1&u=bTask1问题:SOC团队怀疑对手潜伏在他们的环境中,并正在使用PsExec进行横向移动......
  • 常见线程安全类
    常见线程安全类StringIntegerStringBufferRandomVectorHashtablejava.util.concurrent包下的类这里说它们是线程安全的是指,多个线程调用它们同一个实例的某个方法时,是线程安全的。也可以理解为Hashtabletable=newHashtable();newThread(()->{table.put("key","valu......
  • C++11 多线程
    文章参考:C++教程|爱编程的大丙(subingwen.cn)C++11的原子量与内存序浅析-兔晓侠-博客园(cnblogs.com)从C++11起,C++为用户提供一套新的多线程类。线程相关操作头文件:thread#include<thread>一.std::thread1.初始化和析构默认构造函数:原型:thread()noexce......
  • 多线程
    sleep方法:sleep方法使当前线程暂停执行指定的时间,然后继续执行。在线程休眠期间,它不会释放任何锁资源。sleep方法主要用于控制线程的执行速度或等待某个条件成立。Thread.sleep(5000);//休眠5秒钟Threadt1=newThread(newRunnable(){@Overridepubl......
  • 无涯教程-Java - 线程控制函数
    核心Java提供了对多线程程序的完全控制,您可以开发一个多线程程序,该程序可以根据您的要求完全挂起,恢复或停止。您可以对线程对象使用各种静态方法来控制其行为。下表列出了这些方法-Sr.No.Method&Remark1publicvoidsuspend()该方法将线程置于挂起状态,可以使用resume()......
  • 无涯教程-Java - 处理线程死锁函数
    死锁描述了一种情况,其中两个或多个线程永远被阻塞,互相等待,当多个线程需要相同的锁但以不同的顺序获得它们时,就会发生死锁。Java多线程程序可能会遇到死锁情况,因为synchronized关键字会导致正在执行的线程在等待与指定对象关联的锁时被阻塞。这是一个示例。publicclassTestT......
  • 权威外媒报道:波场TRON正式集成 Blockchain.com Pay 以提升用户体验
    近日,波场TRON战略性地集成Blockchain.comPay引发外媒高度关注。其中,国际权威加密媒体Theblock特别报道表示,在此合作关系之下,波场TRON用户仅需点击小部件,即可享受Blockchain.comPay高效的基础设施和便捷的流动性入口。评论人士表示,波场TRON集成Blockchain.comPay可以提......
  • MegEngine 优化 dataloader 使用体验!data monitor 帮助更好定位性能瓶颈
    业务模型训练中Data部分可能是瓶颈所在在训练业务模型过程中,如果我们发现模型的训练速度不符合预期,往往会下意识地认为网络本身出了问题。但实际上,大多数时候问题发生在模型的数据供给逻辑中。区分一个训练过程的瓶颈到底是在准备数据,还是在网络的计算阶段其实是很简单的。比......
  • 【多线程笔记】Channel
    在面对生产者-消费者的场景下,netcore提供了一个新的命名空间System.Threading.Channels来帮助我们更高效的处理此类问题,有了这个Channels存在,生产者和消费者可以各自处理自己的任务而不相互干扰,有利于两方的并发处理,这篇文章我们就来讨论下如何使用System.Threading......