【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;

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/229830.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker学习(二十、network使用示例host、none)

文章目录 一、host应用示例总结 二、none应用示例总结 network相关内容: docker学习(十八、network介绍) docker学习(十九、network使用示例bridge) docker学习(二十、network使用示例host、none&#xff0…

使用sdf文件+urdf文件模拟机器人示例(不用把urdf转sdf)

gazebo版本&#xff1a;harmonic&#xff1b; <launch> <group> <let name"robot_description" value"$(command xacro $(find-pkg-share gazebo_pkg)/urdf/total.xacro)"/> <node pkg"rviz2" exec"rviz2" name…

冠赢互娱基于 OpenKrusieGame 实现游戏云原生架构升级

作者&#xff1a;力铭 关于冠赢互娱 冠赢互娱是一家集手游、网游、VR 游戏等研发、发行于一体的游戏公司&#xff0c;旗下官方正版授权的传奇类手游——《仙境传奇》系列深受广大玩家们的喜爱。基于多年 MMORPG 类型游戏的自研与运营经验&#xff0c;冠赢互娱正式推出了 2D M…

python爬虫

python爬虫 一、Urllib1、互联网爬虫2、爬虫的核心3、爬虫的用途4、爬虫分类5、反爬手段6、urllib库的使用7、请求对象的定制8、编解码9、ajax的get请求10、ajax的post请求11、URLError\HTTPError12、cookie登录13、Handler处理器14、代理服务器 一、Urllib 1、互联网爬虫 解…

Allins 官网正式上线,铭文赛道进入 AMM 交易时代

“Allins 正在通过全新的 AMM 方案为BRC20及多链铭文资产拓展 DeFi 场景&#xff0c;官网的全新上线意味着铭文资产的交易正式进入 AMM 时代。”

java实现大文件分片上传

背景&#xff1a; 公司后台管理系统有个需求&#xff0c;需要上传体积比较大的文件&#xff1a;500M&#xff0d;1024M&#xff1b;此时普通的文件上传显然有些吃力了&#xff0c;加上我司服务器配置本就不高&#xff0c;带宽也不大&#xff0c;所以必须考虑多线程异步上传来提…

(一)CarPlay集成开发之概述与环境篇

系列文章目录 第一章 CarPlay集成开发之概述与环境篇 文章目录 系列文章目录概述开发环境依赖项总结 概述 CarPlay是由苹果公司开发的一款集成在iOS系统中&#xff0c;用于运行在已完成对接该系统的汽车中控台&#xff0c;仪表盘上的车载系统&#xff0c;该系统通过USB或者WI…

java进阶四-深入理解泛型和注解

泛型和注解是框架技术必备的技能 5 泛型5.1泛型理解5.1.1 泛型概念5.1.2 泛型的特点5.1.3 如何理解Java中的泛型是伪泛型&#xff1f;5.1.4 泛型的价值 5.2 泛型语法5.2.1 泛型类5.2.2 泛型接口3.2.3 泛型方法3.2.4泛型的上下边界3.2.5创建泛型数组 5.3泛型应用场景5.3.1数据库…

C++八股学习心得.3

1.C 数组 C 支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往被认为是一系列相同类型的变量。所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素&#xff0c;最高的地址对应最后一个…

dvwa问题篇 -- dvwa出现数据库无法访问的时候,Could not connect to the MySQL service. -- 小黑解决教程

各位小伙伴初次玩dvwa会出现各种问题&#xff0c;本来想把一些问题直接总结写一篇dvwa文章来着&#xff0c;但因为都是关键字搜索&#xff0c;所以将一些问题都拆分出来&#xff0c;以便大家方便查类似问题。&#xff08;大家有遇到不一样的问题欢迎投稿&#xff01;&#xff0…

文件夹变0字节文件数据恢复方法

对于许多电脑用户来说&#xff0c;在使用电脑的过程中&#xff0c;经常会遇到一个令人头疼的问题&#xff1a;执行文件夹变0字节文件操作&#xff0c;导致数据丢失。这是一个相当普遍的现象&#xff0c;但遗憾的是&#xff0c;目前相对于其他类型的数据丢失&#xff0c;如删除或…

python c语言 代码动态检查,python c语言语法分析

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python c语言 代码动态检查&#xff0c;python c语言语法分析&#xff0c;今天让我们一起来看看吧&#xff01; Source code download: 本文相关源码 初学编程&#xff0c;应该学习哪一门编程语言&#xff0c;有不少人感…

OS 7--DNS配置+Apache发布网站

环境准备 centOS 7 1.配置DNS 1.1 域名为lianxi.com 1.2 为WWW服务器、FTP服务器、NEWS服务器做域名解析 1)安装DNS yum -y install bind bind-utils (如果安装不上&#xff0c;就把磁盘在重洗挂载一下&#xff09; 2&#xff09;修改DNS配置文件 vim /etc/resolv.conf…

gookit/color - Go语言命令行色彩使用库教程

gookit/color - Go语言命令行色彩使用库教程 1.安装2.基础颜色(16-color)3.256色彩/RGB风格 1.安装 go get github.com/gookit/color2.基础颜色(16-color) 提供通用的API方法&#xff1a;Print Printf Println Sprint Sprintf 1、例如&#xff1a; color.Yellow.Println(&q…

计算机网络【EPOLL 源码详解】

IO多路复用 在以前&#xff0c;传统的网络编程是多线程模型&#xff0c;一个线程单独处理一个请求。 然而&#xff0c;线程是很昂贵的资源&#xff1a; 线程的创建和销毁成本很高&#xff0c;linux的线程实际上是特殊的进程&#xff1b;因此通常会使用线程池来减少线程创建和…

邮件群发称呼怎么写?写群发邮件开头技巧?

如何写外贸邮件群发称呼&#xff1f;外贸群发邮件开头怎么称呼&#xff1f; 邮件群发已成为企业、个人和组织之间沟通的重要手段。而一个恰当的称呼&#xff0c;不仅能够展现出礼貌和尊重&#xff0c;还能够拉近彼此的距离。那么&#xff0c;如何写好邮件群发的称呼呢&#xf…

Swagger 教程:从零开始学习Swagger

Swagger 是一个开源的 API 设计和文档工具&#xff0c;可以帮助全栈工程师更快、更简单地设计、构建、文档化和测试 RESTful API。本篇文章将为全栈工程师介绍 Swagger 的基础知识和使用方法&#xff0c;以及如何使用 Swagger 设计、文档化和测试 RESTful API。 一、Swagger 简…

关键字:new关键字

在 Java 中&#xff0c;new关键字用于创建对象实例。它是对象创建的语法糖&#xff0c;用于分配内存空间并调用构造函数来初始化对象。 以下是new关键字的基本语法&#xff1a; 在上述语法中&#xff0c;ObjectType是要创建对象的类名&#xff0c;objectName是对象的引用变量…

Allins 官网上线,标志铭文赛道正式进入 AMM 交易时代

“Allins 正在通过全新的 AMM 方案为BRC20及多链铭文资产拓展 DeFi 场景&#xff0c;官网的全新上线意味着铭文资产的交易正式进入 AMM 时代。”

HW06 GAN来生成卡通人物头像- simple

simple -GAN 理论 生成对抗网络(GAN)是最近十年来比较火爆的技术之一,被誉为21世纪最有趣的创想。GAN作为生成网络,自然是可以生成诸多形式的数据,这些数据甚至是现实世界中不曾存在的。例如,最近非常火爆的换脸技术,或者是称为DeepFake,就是GAN的杰作(当然不可能是…