当前位置: 首页 > news >正文

【C#】知识点实践序列之Lock的锁定代码块

大家好,我是全栈小5,欢迎来到《小5讲堂之知识点实践序列》文章。
2024年第1篇文章,此篇文章是C#知识点实践序列之Lock知识点,博主能力有限,理解水平有限,若有不对之处望指正!
本篇验证Lock锁定代码执行情况,锁定外上下代码和锁定区域的代码执行情况。

在这里插入图片描述

目录

  • 基本概念
    • 锁流程
    • 注意点
  • 实践场景
    • 锁定代码块
      • 效果
      • 代码
  • 疑问解答
    • 消息队列
  • 常见报错

在这里插入图片描述

基本概念

在 C# 中,锁(lock)是一种用于实现多线程同步的机制。
它可以用来确保在任何给定时间只有一个线程可以访问被锁定的代码块,以避免数据竞争和并发访问的问题。

  • 流程图
    在这里插入图片描述

锁流程

1、创建一个共享资源,在多个线程之间需要安全地访问该资源。
2、使用 lock 关键字来定义一个临界区域(即需要同步的代码段),将要访问共享资源的代码放置在该临界区域内。
3、在进入临界区域之前,线程会尝试获取锁。如果锁已经被其他线程持有,则当前线程会阻塞,直到锁释放。
4、当线程得到锁之后,它可以安全地访问临界区域内的代码,执行完毕后释放锁,以便其他线程可以继续执行。

注意点

1、锁定的对象应该是所有线程都可以访问到的共享对象,常见的做法是使用一个私有变量作为锁对象。
2、锁的范围应该尽量小,只锁定必要的代码区域,以避免不必要的线程阻塞。
3、锁的使用应遵循一致的原则,即在所有访问共享资源的地方都要使用同一个锁对象。这样可以确保所有线程都按顺序获取锁,避免死锁的发生。

实践场景

通过实际例子来验证知识点的基本概念,这样能够加深对知识点的理解,只有对知识点的理解足够深,才能更好的编写高质量代码和实现高效逻辑代码。

锁定代码块

以下是展示代码块被锁定,但方法内其他代码仍然按顺序直接执行。
比如同时进行操作点击用户a、用户b、用户c、三个按钮,然后都会调用同一个方法,方法内只锁定统计数量,并且锁定3秒,其他代码没有锁定。

效果

从以下界面效果可以知道,没有被锁定代码是会先执行,然后锁定区域先执行用户a,然后锁定3秒后,再执行用户b,依此类推。
在这里插入图片描述

代码

namespace XxxData
{public partial class Form1 : Form{public Form1(){InitializeComponent();CheckForIllegalCrossThreadCalls = false;}private void Form1_Load(object sender, EventArgs e){}private int visitorCount = 0;private void TargetData(string user){txtInfo.AppendText($"{user}{DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss")}\r\n");lock (this){visitorCount += 1;lbVisitorCount.Text = $"访问用户数:{visitorCount}";Thread.Sleep(3 * 1000);txtInfo.AppendText($"{user}执行完毕,{DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss")}\r\n");}}private void btnA_Click(object sender, EventArgs e){Task.Run(() =>{TargetData("用户a");});}private void btnB_Click(object sender, EventArgs e){Task.Run(() =>{TargetData("用户b");});}private void btnC_Click(object sender, EventArgs e){Task.Run(() =>{TargetData("用户c");});}}
}

疑问解答

消息队列

Lock锁定代码块是否属于一种消息队列,多个访问同时进来,只能排队一个一个访问。A执行完Lock方法内的代码才允许下一个执行进来。

并不是,C# 的 lock 关键字并不是一种消息队列。它是一种线程同步机制,用于在多线程访问共享资源时确保同一时间只有一个线程可以进入被锁定的代码块。
当多个线程同时访问含有 lock 代码块的区域时,只有一个线程能够获取到锁,进入临界区域执行代码,其余线程则被阻塞并排队等待锁的释放。一旦获取到锁的线程执行完毕,释放锁后,等待队列中的下一个线程会获取锁,依此类推。
这种机制确保了同一时间只有一个线程能够访问共享资源,避免了数据竞争和并发访问的问题。但请注意,锁并不提供先后顺序的保证,即不保证等待队列中线程按照某种特定的顺序获取锁。
消息队列是另一种机制,用于线程(或进程)间的通信。它允许将消息从一个线程发送到另一个线程,接收线程可以按照消息的先后顺序处理消息,实现异步通信和任务分发。而 lock 关键字只是提供了互斥访问的能力,并不涉及消息的发送和接收。

常见报错

##跨线程访问
由于label控件是在主线程,在Task线程默认是无法访问在这里插入图片描述
解决方法,在异步方法前面增加如下代码

CheckForIllegalCrossThreadCalls = false;

总结:温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

相关文章:

【C#】知识点实践序列之Lock的锁定代码块

大家好,我是全栈小5,欢迎来到《小5讲堂之知识点实践序列》文章。 2024年第1篇文章,此篇文章是C#知识点实践序列之Lock知识点,博主能力有限,理解水平有限,若有不对之处望指正! 本篇验证Lock锁定代…...

StringBad ditto (motto)

第12章 类和动态内存分配 StringBad ditto (motto): // calls StringBad (comst StringBad &) StringBad metoo - motto: // calls StringBad (const StringBad &) StringBad also StringBad (motto): // calls StringBad (const StringBad &) StringBad * pStri…...

Redis缓存击穿、缓存雪崩、缓存穿透

缓存击穿(某个热点key缓存失效) 概念 缓存中没有但数据库中有的数据,假如是热点数据,那key在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力增大和缓存雪崩的…...

【PCB专题】Allegro封装更新焊盘

在PCB封装的绘制中,有时会出现需要更新焊盘的情况。比如在制作封装的过程中发现焊盘做的不对而使用PAD_Designer重新更新了焊盘。 那在PCB中如何更新已经修改过的焊盘呢? 打开封装,选择Tools->Padstack->Refresh... 选择Refresh all …...

ES6之Reflect详解

✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…...

文件监控-IT安全管理软件

文件监控和IT安全管理软件是用于保护企业数据和网络安全的工具。这些工具可以帮助企业监控文件的变化,防止未经授权的访问和修改,并确保数据的安全性和完整性。 一、具有哪些功能 文件监控软件可以实时监控文件系统的活动,包括文件的创建、修…...

达梦数据库安装超详细教程(小白篇)

文章目录 达梦数据库一、达梦数据库简介二、达梦数据库下载三、达梦数据库安装1. 解压2. 安装 四、初始化数据库五、DM管理工具 达梦数据库 一、达梦数据库简介 ​ 达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。 达梦数…...

复试 || 就业day09(2024.01.04)算法篇

文章目录 前言验证外星语词典在长度 2N 的数组中找出重复 N 次的元素找到小镇的法官查找共用字符数组的相对排序分发饼干分发糖果区间选点(AcWing)最大不相交区间数量(AcWing)无重叠区间关于重写小于号 前言 💫你好,我是辰chen,本文旨在准备考…...

Win10电脑关闭OneDrive自动同步的方法

在Win10电脑操作过程中,用户想要关闭OneDrive的自动同步功能,但不知道具体要怎么操作?首先用户需要打开OneDrive,然后点击关闭默认情况下将文档保存到OneDrive选项保存,最后关闭在这台电脑上同步设置保存就好了。接下来…...

linux(centos)相关

文件架构: bin--binary--二进制命令,可直接执行 sbin systembin系统二进制命令,超级管理员 lib 库目录 类似dll文件 lib64 64位系统相关的库文件 usr 用户文件 boot 引导分区的文件,链接,系统启动等 dev device设备目录…...

外贸网站显示不安全警告怎么办?消除网站不安全警告超全指南

外贸网站显示不安全警告怎么办?当用户访问你的网站,而您的网站没有部署SSL证书实现HTTPS加密时,网站就会显示不安全警告,这种警告,不仅有可能阻止用户继续浏览网站,影响网站声誉,还有可能影响网…...

Java:HeapMemory和DirectMemory配置与使用介绍

目录 一、Heap内存 1、查看Heap内存配置的最大值 2、配置Heap内存最大值的方式 3、配置Heap内存最小值的方式 4、查看已使用Heap内存的方式 5、查看未使用Heap内存的方式 二、Direct内存 1、查看Direct内存配置的最大值 2、配置Direct内存最大值的方式 3、获取Direct…...

记 -bash: docker-compose: command not found 的问题解决

docker-compose: command not found 错误表明系统无法找到 docker-compose 命令。这可能是因为 docker-compose 并未正确安装,或者其可执行文件的路径未包含在系统的 PATH 变量中。 以下是我遇到时解决方法: 确保 Docker 和 Docker Compose 已安装&…...

分享10篇优秀论文,涉及图神经网络、大模型优化、表格分析

引言 第38届AAAI人工智能年度会议将于2024年2月在加拿大温哥华举行。今天给大家分享十篇AAAI2024论文,主要涉及图神经网络,大模型幻觉、中文书法文字生成、表格数据分析、KGs错误检测、多模态Prompt、思维图生成等。 论文获取方式,回复&am…...

Ubuntu 24.04 Preview 版安装 libtinfo5

Ubuntu 24.04 Preview 版安装 libtinfo5 0. 背景1. 安装 libtinfo52. 安装 cuda 0. 背景 Ubuntu 24.04 Preview 版安装 Cuda 时报确实 libtinfo5 的错误。 1. 安装 libtinfo5 wget http://archive.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.4-2_amd64.deb dpk…...

Spring AOP<一>简介与基础使用

spring AOP 基础定义 含义使用切面组织多个Advice,Advice放在切面中定义。也就是说是定义通知的自定义类。自定义的AOP类Aspect连接点方法调用,异常抛出可以增强的点JoinPoint :也就是**被增强的方法的总称,可以获取具体方法的信息&#xff…...

react ant tree节点没有children也会显示展开框 节点有children却不显示展开框

1.背景 最近处理树状结构时遇到了一个诡异问题,后端返回了组织树,组织树里面可能有组织,也可能有用户,很奇怪的是所有用户都会显示展开图标,而组织有些会显示展开图标,有些不会显示 2.分析 一开始找到了用…...

【Linux】进程查看|fork函数|进程状态

🦄 个人主页——🎐开着拖拉机回家_Linux,大数据运维-CSDN博客 🎐✨🍁 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁&am…...

LeetCode第98题 - 有效的括号

题目 解答 方案一 class Solution {public boolean isValidBST(TreeNode root) {if (root null) {return true;}if (root.left null && root.right null) {return true;}if (root.left ! null && root.left.val > root.val) {return false;}if (root.…...

Nacos学习思维导图

一、服务注册 参考文档:http://www.bryh.cn/a/118936.html https://blog.csdn.net/Saintmm/article/details/121981184 二、服务续约 参考文档:http://www.bryh.cn/a/118936.html https://blog.csdn.net/Saintmm/article/details/121981184 三、服务…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...