浅析 C# Lock
Lock的定义以及概念
实现线程同步的第一种方式是我们经常使用的lock关键字,它将包围的语句块标记为临界区,这样一次只有一个线程进入临界区并执行代码。下面第一段的几行代码是关于lock关键字的使用方式,但更重要的是我们可以通过这个例子来看到lock关键字的本质。第二段是这个方法的IL指令集,从中可以看到lock其实也是一个语法糖,它的内部实现是采用了监视器Monitor。
lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。
模拟应用场景
用多个线程同时操作一个方法,这里模拟存钱的场景。多用户(线程)操作存钱的操作。(代码如下:)
测试使用Winform程序,一个按钮,一个RichTextBox
代码如下:
private static object locker = new object();//定义对象public static int sum = 0; //总账户余额//存钱的业务逻辑private void addToSum(){lock (locker)//加锁{while (true){richTextBox1.Invoke(new Action<string>((x) =>{richTextBox1.AppendText("正在存钱" + x);sum += 100;//Thread.Sleep(TimeSpan.FromMilliseconds(2000)); //此处是占用了主线程,会导致UI卡着不动,刷新迟缓。所以卸载Invoke外层去了,不信可以用下面的if做下测试richTextBox1.AppendText("当前余额为" + sum + "\r\n");System.Windows.Forms.Application.DoEvents();}), Thread.CurrentThread.Name);// if (sum >= 1000) { break; }Thread.Sleep(TimeSpan.FromMilliseconds(2000));}}}
下面来操作这个账户,声明多个线程来操作这个方法。看下执行效果。
private void button1_Click(object sender, EventArgs e){Thread th1 = new Thread(addToSum);th1.Name = "th1name";//指定线程名称,方便区分Thread th2 = new Thread(addToSum);th1.Start();Thread.Sleep(1000);th2.Start();}
分两种情况来解析
第一种是,加锁的情况下
lock (locker)//加锁
第二种是将这段代码块注释掉,分别看下执行效果。
//lock (locker)//加锁 注释掉
执行结果如下:加锁
不加锁:
以上为执行结果,可以看出,加锁与不加锁的情况下,执行结果显然不同。
欢迎大家指正。感谢。
更多博文,请点击下方链接,共同学习,共同进步。
C#设计模式,工厂三兄弟
浅析 C# Lock相关推荐
- C++多线程 互斥锁 信号量 事件 临界区
一.互斥锁 1.先熟悉熟悉API 1,创建互斥锁,并反正一个句柄 HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全 ...
- 浅析Lock工具类LockSupport
LockSupport是一个编程工具类,主要是为了阻塞和唤醒线程用的,所有的方法都是静态方法,可以让线程在任意位置阻塞,也可以在任意位置唤醒.使用它我们可以实现很多功能,今天主要就是对这个工具类的讲解 ...
- alter table锁表,MySQL出现Waiting for table metadata lock的场景浅析及解决方案
在修改/增加表字段的时候,发现很慢, show processlist; 时, Waiting for table metadata lock 能一直锁很久. 官网的一段话,可以理解下 http:// ...
- mysql alter table 锁表_alter table锁表,MySQL出现Waiting for table metadata lock的场景浅析及解决方案...
在修改/增加表字段的时候,发现很慢, show processlist; 时, Waiting for table metadata lock 能一直锁很久. 官网的一段话,可以理解下 8.10.4. ...
- Python标准库queue模块原理浅析
Python标准库queue模块原理浅析 本文环境python3.5.2 queue模块的实现思路 作为一个线程安全的队列模块,该模块提供了线程安全的一个队列,该队列底层的实现基于Python线程th ...
- Python标准库threading模块Condition原理浅析
Python标准库threading模块Condition原理浅析 本文环境python3.5.2 threading模块Condition的实现思路 在Python的多线程实现过程中,在Linux平 ...
- harbor登录验证_Harbor 源码浅析
Harbor 源码浅析www.qikqiak.com Harbor 是一个CNCF基金会托管的开源的可信的云原生docker registry项目,可以用于存储.签名.扫描镜像内容,Harbor 通 ...
- .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析
.NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析 .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析 作者:&;nbsp来自:网络 htt ...
- 从C++20 shared_ptr移除unique()方法浅析多线程同步
@[TOC](从C++20 shared_ptr移除unique()方法浅析多线程同步) std::shared_ptr的unique()方法做了什么事情? unique()作为std::shared ...
最新文章
- ASP.NET MVC 右键点击添加没有区域(Area)、控制器、试图等选项
- 在一个集合S中寻找最大的C使A+B=C且A,B,C均在集合当中
- pacman安装ubuntu_Ubuntu如何安装pacman
- mybatis 获得一个map的返回集合
- 前端技巧:如何使用nodejs实现举牌人表情包?
- PKUSC2018训练日程(4.18~5.30)
- java静态方法获取对象_JavaPowerMockito模拟单个静态方法和返回对象
- Redis系列教程(七):Redis并发竞争key的解决方案详解
- Redis面试 - 生产环境中的 redis 是怎么部署的?
- Extjs可视化设计视频教程一
- feign session 调用_Feign调用session丢失解决方案
- Windows Server 2012 R2磁盘分区
- 魔方机器人之搭建Python编程环境
- 第一章概述-------第一节--1.2互联网概述
- 电子学会2022年12月青少年软件编程(图形化)等级考试试卷(一级)答案解析
- 小点评《实战SAP程序开发》-电子工业出版社 北京
- 微信官方支付接口配置教程
- matlab armax和arima区别,ARMA和ARIMA的区别是什么?
- 认识微型计算机的硬件课件,微型计算机系统硬件组成及外设认识.docx
- 库卡工业机器人负载曲线图_DC电机性能曲线图