Lock、Monitor线程锁
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返回锁没释放。
Lock、Monitor线程锁的更多相关文章
- [转载] java并发编程:Lock(线程锁)
作者:海子 原文链接: http://www.cnblogs.com/dolphin0520/p/3923167.html 出处:http://www.cnblogs.com/dolphin0520/ ...
- C# lock关键词/lock语句块、线程锁
一.lock关键词说明 1. lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁. 2. lock 语句块锁定,功能等同于 Monitor.Enter(obj): ...
- 【python】-- GIL锁、线程锁(互斥锁)、递归锁(RLock)
GIL锁 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行的, ...
- python8.2线程锁
import threading lock=threading.Lock()#创建线程锁:互斥锁num=100def run(name): lock.acquire()#设置锁 global num# ...
- 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock
[源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...
- Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁
(1)synchronized 是互斥锁: (2)ReentrantLock 顾名思义 :可重入锁 (3)ReadWriteLock :读写锁 读写锁特点: a)多个读者可以同时进行读b)写者必须互斥 ...
- 【转】多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)
本篇从Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler的类关系图开始,希望通过 本篇的介绍能对常见的线程同步方法有一个整体的认识,而对 ...
- 线程系列08,实现线程锁的各种方式,使用lock,Montor,Mutex,Semaphore以及线程死锁
当涉及到多线程共享数据,需要数据同步的时候,就可以考虑使用线程锁了.本篇体验线程锁的各种用法以及线程死锁.主要包括: ※ 使用lock处理数据同步※ 使用Monitor.Enter和Monitor.E ...
- C# 关于线程锁lock的使用方法
C# 关于线程锁lock的使用方法 原创 2016年09月02日 10:07:05 标签: c# / 线程 / 锁 / lock 11937 在多线程编程中,可能会有许多线程并发的执行一段代码(代码块 ...
- C# 异步锁 await async锁,lock,Monitor,SemaphoreSlim
异步方法内无法使用Monitor 和lock 所以只能用System.Threading.SemaphoreSlim了 //Semaphore (int initialCount, int maxim ...
随机推荐
- C# OpenCvSharp MatchTemplate 多目标匹配
效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.D ...
- @Value static静态变量注入
@Component public class Config { @Value("${config1}") private static String config1; } 使用上 ...
- AXI4从机总线分析验证之读取寄存器值
AXI4从机总线分析验证之读取寄存器值 1.实验目的 利用前面所学的AXI4总线协议的理论分析,验证如何将一个PL的输入信号通过AXI发送到PS端.大致思路就是取一个按键,信号接入自建的AXI4的IP ...
- archlinux xfce 出现[FAILED] Failed to mount /boot, systemctl status boot.mount出现 mount: /boot: unknown filesystem type 'vfat' 滚挂了
开机显示:[FAILED] Failed to mount /boot 使用命令systemctl status boot.mount后出现 mount: /boot: unknown filesys ...
- Windows下获取设备管理器列表信息-setupAPI
背景及问题: 在与硬件打交道时,经常需要知道当前设备连接的硬件信息,以便连接正确的硬件,比如串口通讯查询连接的硬件及端口,一般手工的方式就是去设备管理器查看相应的信息,应用程序如何读取这一部分信息呢, ...
- 软件发布版本号命名风格(GUN)
GUN风格: (1)产品初版时,版本号可以为0.1或0.1.0,也可以为1.0或1.0.0: (2)当产品进行了局部修改或bug修正时,主版本号和子版本号都不变,修正版本号+1: (3)当产品在原有的 ...
- 关于Guava Cache 需要注意的几点
一.元素过期策略 expireAfterWrite(long duration, TimeUnit unit):在元素[写入]或者[值更新]后的一段时间之后,自动移除元素. 当duration=0时, ...
- HMS Core助力开发者打造高品质游戏,共创智玩新生态
2021年8月1日,华为HMS Core.Sparkle游戏应用创新沙龙在上海举行.会上,华为HMS Core团队与游戏行业开发者围绕3D图形渲染.网络加速.精准运营等多个话题,探讨了游戏应用开发技术 ...
- 【Kotlin】List、Set、Map简介
1 List Java 的 List.Set.Map 介绍见 → Java容器及其常用方法汇总. 1.1 创建 List 1.1.1 emptyList var list = emptyList& ...
- 挑战吧,HarmonyOS应用开发工程师
一年一度属于工程师的专属节日1024已过,但程序员多重活动持续进行中~ 参与活动即有机会获得HUAWEI Freebuds 5i 耳机等精美礼品! 点击"阅读原文"查看更多活动 ...