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 ...
随机推荐
- 使用Go语言开发一个短链接服务:五、添加和获取短链接
章节 使用Go语言开发一个短链接服务:一.基本原理 使用Go语言开发一个短链接服务:二.架构设计 使用Go语言开发一个短链接服务:三.项目目录结构设计 使用Go语言开发一个短链接服务:四.生成 ...
- Java Agent技术
在定位公司问题的时候,需要了解一下skywalking的相关知识,而agent就提上了日程. 官网文档 Agent技术是Jdk在1.5版本之后,所提供的一个在jvm启动前后对部分java类代理加强的机 ...
- SpringBoot 常用注解总结
核心注解 1. @SpringBootApplication 主要用于开启自动配置,它也是一个组合注解,主要组合了 @SpringBootConfiguration.@EnableAutoConfig ...
- [ROS串口通信]Serial库读入结构体
本文介绍使用c++中Serial库读入结构体: //例如,结构体定义如下: typedef struct __attribute__((packed)) { uint16_t team; /* 本身队 ...
- 学生成绩管理--C语言
# 学生成绩管理系统 效果 1.菜单选项 void welcome()//菜单 { printf("欢迎使用学生管理系统\n"); printf(" 1.增加学生信息\n ...
- C++ 中的 volatile 和 atomic
C++ 中的 volatile 和 atomic 0. TL;DR std::atomic 用于多线程并发场景,有两个典型使用场景: 原子操作:对 atomic 变量的操作(读/写/自增/自减)仿佛受 ...
- DNS的各种记录类型的应用解析
可能很多人平时工作中不会遇到DNS配置相关的问题, 但如果偶尔遇到不同类型DNS记录的配置, 在没有搞清楚它们都是干啥的情况下, 会眼花缭乱, 还记得很多年前实验室配置DNS不太对导致只能访问www. ...
- #轮廓线dp,博弈论#洛谷 4363 [九省联考 2018] 一双木棋 chess
题目传送门 分析 菲菲想让答案尽量大,牛牛想让答案尽量小. 很天真的一种想法就是设 \(dp[i][j]\) 表示现在选择 \((i,j)\) 的答案. 但是这样有一个弊端就是并不知道其它位置怎么选择 ...
- Git 教程:解密 .gitignore 文件、合并分支、解决冲突、及 Git 帮助
Git 帮助 如果你忘记了命令或命令的选项,你可以使用 Git 帮助. 在命令行中,有几种不同的使用帮助命令的方式: git command -help - 查看特定命令的所有可用选项 git hel ...
- 新一期HarmonyOS认证正式发布,速来围观!
原文:https://mp.weixin.qq.com/s/mvXLnJM9VKTyq8mi9BfY1w,点击链接查看更多技术内容. 华为认证HarmonyOS应用开发高级工程师HCIP-Harm ...