c# lock (obj) 与 lock (this) 区别
lock(obj) 锁定 obj 对象
lock(this) 锁定 当前实例对象,如果有多个类实例的话,lock锁定的只是当前类实例,对其它类实例无影响。
直接上代码。
主窗体代码如下:
delegate void SetTextCallback(string text);public Form1() { InitializeComponent(); }/// <summary>/// 利用委托设置 文本框内容/// </summary>/// <param name="text"></param> public void SetText(string text) {if (this.textBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText);this.Invoke(d, new object[] { text }); }else {this.textBox1.Text = this.textBox1.Text + "\r\n" + text; } } private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; Thread[] thd = new Thread[500];int intI = 0;for (intI = 0; intI < 50; intI++) { thd[intI] = new Thread(new ParameterizedThreadStart(thdText)); thd[intI].Name = " Thread" + intI.ToString(); thd[intI].IsBackground = true; thd[intI].Start(intI); } }/// <summary>/// 线程调用的方法/// </summary>/// <param name="obj"></param> private void thdText(object obj) { oper op = new oper();int intI = Convert.ToInt32(obj); SetText(op.addition()); }
1、lock(obj)
添加oper类,代码如下:
public class oper {private static object obj = new object(); private static Single slgTotal; public string addition() {lock (obj) {int intI = 0; slgTotal = 0;for (intI = 0; intI <= 50; intI++) { slgTotal = slgTotal + intI; Thread.Sleep(5); } return slgTotal.ToString() + " thread:" + Thread.CurrentThread.Name; } } }
执行结果如下:
大家看到每个线程执行的结果都是相同的。下面来看lock(this)
2、lock(this)
将oper类代码修改为如下:
public class oper {private static object obj = new object(); private static Single slgTotal; public string addition() {lock (this) {int intI = 0; slgTotal = 0;for (intI = 0; intI <= 50; intI++) { slgTotal = slgTotal + intI; Thread.Sleep(5); } return slgTotal.ToString() + " thread:" + Thread.CurrentThread.Name; } } }
执行结果如下:
大家看到每个线程执行的结果都是不同的。
分析:lock(this) 锁定的对象 是当前类实例,而每个线程操作的都是oper的新实例,lock(this)只对当前实例起作用,而 slgTotal 是类的静态变量,lock(this)实际上是没在起起我们想要的结果。下面再看一种lock(obj)的实例
3、lock(obj) 这个第一个obj的demo稍有不同,即把oper类的obj静态变量修改为变量,oper类修改为如下:
public class oper {private object obj = new object(); private static Single slgTotal; public string addition() {lock (obj) {int intI = 0; slgTotal = 0;for (intI = 0; intI <= 50; intI++) { slgTotal = slgTotal + intI; Thread.Sleep(5); } return slgTotal.ToString() + " thread:" + Thread.CurrentThread.Name; } } }
执行结果如下:
此次运行结果和lock(this)结果是一样的。这是为什么呢?
总结:其实大家不要去看lock中锁定的是this,还是obj,大家只要关心多线程锁定的对象是不是为同一个对象。如果是同一个对象则会得到如上边的demo1结果,否则则如demo2和demo3中的结果,也是我们不想要的。
转载于:https://www.cnblogs.com/yuqilin/archive/2011/10/15/2213766.html
c# lock (obj) 与 lock (this) 区别相关推荐
- 关于Application.Lock和Lock(obj)
1.Application.Lock和Application.UnLock一般配对出现,用于锁住Lock与UnLock之间的所有代码(注意不光锁住对于Application的赋值). 2.Lock(o ...
- ReentrantLock中lock/trylock/lockInterruptibly方法的区别及源码解析
看了几篇关于这三者区别的文章,但都说的不够具体,自己去读了下源码,大概是清楚了三者的功能,不想了解源码的可以跳到最后看总结. 首先,ReentrantLock类中使用了大量的CAS操作,也就是Comp ...
- 使用synchronized实现Lock接口的lock和unlock方法
public class TestLock implements Lock {private Object lock = new Object();private long owner = -1;@O ...
- 【等待事件】序列等待事件总结(enq: SQ - contention、row cache lock、DFS lock handle和enq: SV - contention)...
[等待事件]序列等待事件总结(enq: SQ - contention.row cache lock.DFS lock handle和enq: SV - contention) [等待事件]序列等待事 ...
- 解决 xxx is not running, but lock file (/var/lock/subsys/xxx) exists
一.现象 运行Linux下的程序时,很多时候因为异常或某些不知名因素被强 退,当你重新启动时,发现系统会报一个**"ERROR! xxx is not running, but lock f ...
- caps lock_在Ubuntu中启用Caps Lock或Num Lock时如何获取通知
caps lock If you've accidentally turned on Caps Lock too many times–we've all been there–here is a s ...
- mysql不同情况下加锁类型实验 record lock 和 gap lock
首先确定RR级别下mysql的加锁规则(实验环境 mysql 8.0): 加锁的基本单位是 next-key lock.是一个前闭后开的区间,也是record lock 和 gap lock 的组合. ...
- lock和synchronized的同步区别与选择
区别如下: 1. lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现:(具体实现上的区别在<Java虚拟机>中有讲解底层的CAS ...
- 线程安全(二)Lock 什么是Lock线程锁?与synchronized区别在哪?Lock锁是如何实现等待通知的?如何实现线程顺序执行?
文章目录 前言 一.synchronized的缺陷 二.Lock接口的特性及基本方法 接口的特性 接口基本的方法: 三.ReentrantLock介绍及实例 ReentrantLock类常见方法: l ...
最新文章
- PE文件结构 - NT头学习
- update-rc.d: error: XXX Default-Start contains no runlevels, aborting.
- Springboot-实现热部署
- 草莓甜品海报设计,甜出画面,受得住诱惑么?
- 统计php代码执行情况,PHP代码执行函数总结
- Android 硬编码
- DSP28335加密问题
- Oracle数据库优化的方法
- 计算机技术对艺术设计的影响,计算机对艺术设计有何影响
- 2020年度十大高薪岗位出炉!程序员霸榜!
- AOP底层实现原理、基于注解的AOP编程、AOP开发中的一个坑 打卡第八天
- Druid未授权漏洞实战利用
- 0开始学py爬虫(学习笔记)(Scrapy框架)(爬取职友集招聘信息)
- 人人都是首席质量官--读后感
- C语言abs函数与fabs函数,函数abs 和fabs
- Windows Server 2012 和 System Center 2012 SP1,Virtual Machine Manager 中启用的软件定义的网络
- linux从零基础开始
- 【IDEA】IDEA常用配置
- 多边形最小外接矩形 旋转卡壳
- 如何做到四位验证码更简洁的生成?