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相关推荐

  1. C++多线程 互斥锁 信号量 事件 临界区

    一.互斥锁 1.先熟悉熟悉API 1,创建互斥锁,并反正一个句柄 HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全 ...

  2. 浅析Lock工具类LockSupport

    LockSupport是一个编程工具类,主要是为了阻塞和唤醒线程用的,所有的方法都是静态方法,可以让线程在任意位置阻塞,也可以在任意位置唤醒.使用它我们可以实现很多功能,今天主要就是对这个工具类的讲解 ...

  3. alter table锁表,MySQL出现Waiting for table metadata lock的场景浅析及解决方案

    在修改/增加表字段的时候,发现很慢, show processlist; 时, Waiting for table metadata lock 能一直锁很久. 官网的一段话,可以理解下 http:// ...

  4. mysql alter table 锁表_alter table锁表,MySQL出现Waiting for table metadata lock的场景浅析及解决方案...

    在修改/增加表字段的时候,发现很慢, show processlist; 时, Waiting for table metadata lock 能一直锁很久. 官网的一段话,可以理解下 8.10.4. ...

  5. Python标准库queue模块原理浅析

    Python标准库queue模块原理浅析 本文环境python3.5.2 queue模块的实现思路 作为一个线程安全的队列模块,该模块提供了线程安全的一个队列,该队列底层的实现基于Python线程th ...

  6. Python标准库threading模块Condition原理浅析

    Python标准库threading模块Condition原理浅析 本文环境python3.5.2 threading模块Condition的实现思路 在Python的多线程实现过程中,在Linux平 ...

  7. harbor登录验证_Harbor 源码浅析

    Harbor 源码浅析​www.qikqiak.com Harbor 是一个CNCF基金会托管的开源的可信的云原生docker registry项目,可以用于存储.签名.扫描镜像内容,Harbor 通 ...

  8. .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析

    .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析 .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析 作者:&;nbsp来自:网络 htt ...

  9. 从C++20 shared_ptr移除unique()方法浅析多线程同步

    @[TOC](从C++20 shared_ptr移除unique()方法浅析多线程同步) std::shared_ptr的unique()方法做了什么事情? unique()作为std::shared ...

最新文章

  1. ASP.NET MVC 右键点击添加没有区域(Area)、控制器、试图等选项
  2. 在一个集合S中寻找最大的C使A+B=C且A,B,C均在集合当中
  3. pacman安装ubuntu_Ubuntu如何安装pacman
  4. mybatis 获得一个map的返回集合
  5. 前端技巧:如何使用nodejs实现举牌人表情包?
  6. PKUSC2018训练日程(4.18~5.30)
  7. java静态方法获取对象_JavaPowerMockito模拟单个静态方法和返回对象
  8. Redis系列教程(七):Redis并发竞争key的解决方案详解
  9. Redis面试 - 生产环境中的 redis 是怎么部署的?
  10. Extjs可视化设计视频教程一
  11. feign session 调用_Feign调用session丢失解决方案
  12. Windows Server 2012 R2磁盘分区
  13. 魔方机器人之搭建Python编程环境
  14. 第一章概述-------第一节--1.2互联网概述
  15. 电子学会2022年12月青少年软件编程(图形化)等级考试试卷(一级)答案解析
  16. 小点评《实战SAP程序开发》-电子工业出版社 北京
  17. 微信官方支付接口配置教程
  18. matlab armax和arima区别,ARMA和ARIMA的区别是什么?
  19. 认识微型计算机的硬件课件,微型计算机系统硬件组成及外设认识.docx
  20. 库卡工业机器人负载曲线图_DC电机性能曲线图

热门文章

  1. python中trunc函数_trunc函数
  2. label标签的for属性要指向input的id属性一致
  3. 1 FFmpeg从入门到精通-FFmpeg简介
  4. Python图片爬取
  5. 各种茶叶的功能,千万不要喝错
  6. 因更新驱动致“win7重启后无法正常启动、无法通过系统还原修复”的解决方案。
  7. 中国首家云存储联合创新实验室落户武汉光谷
  8. 安卓游戏红利开发更多属于巨头
  9. win10 设置软件开机启动项失效
  10. 安全帽佩戴检测——安全生产中的黑科技