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

  1. 关于Application.Lock和Lock(obj)

    1.Application.Lock和Application.UnLock一般配对出现,用于锁住Lock与UnLock之间的所有代码(注意不光锁住对于Application的赋值). 2.Lock(o ...

  2. ReentrantLock中lock/trylock/lockInterruptibly方法的区别及源码解析

    看了几篇关于这三者区别的文章,但都说的不够具体,自己去读了下源码,大概是清楚了三者的功能,不想了解源码的可以跳到最后看总结. 首先,ReentrantLock类中使用了大量的CAS操作,也就是Comp ...

  3. 使用synchronized实现Lock接口的lock和unlock方法

    public class TestLock implements Lock {private Object lock = new Object();private long owner = -1;@O ...

  4. 【等待事件】序列等待事件总结(enq: SQ - contention、row cache lock、DFS lock handle和enq: SV - contention)...

    [等待事件]序列等待事件总结(enq: SQ - contention.row cache lock.DFS lock handle和enq: SV - contention) [等待事件]序列等待事 ...

  5. 解决 xxx is not running, but lock file (/var/lock/subsys/xxx) exists

    一.现象 运行Linux下的程序时,很多时候因为异常或某些不知名因素被强 退,当你重新启动时,发现系统会报一个**"ERROR! xxx is not running, but lock f ...

  6. 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 ...

  7. mysql不同情况下加锁类型实验 record lock 和 gap lock

    首先确定RR级别下mysql的加锁规则(实验环境 mysql 8.0): 加锁的基本单位是 next-key lock.是一个前闭后开的区间,也是record lock 和 gap lock 的组合. ...

  8. lock和synchronized的同步区别与选择

    区别如下: 1. lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现:(具体实现上的区别在<Java虚拟机>中有讲解底层的CAS ...

  9. 线程安全(二)Lock 什么是Lock线程锁?与synchronized区别在哪?Lock锁是如何实现等待通知的?如何实现线程顺序执行?

    文章目录 前言 一.synchronized的缺陷 二.Lock接口的特性及基本方法 接口的特性 接口基本的方法: 三.ReentrantLock介绍及实例 ReentrantLock类常见方法: l ...

最新文章

  1. PE文件结构 - NT头学习
  2. update-rc.d: error: XXX Default-Start contains no runlevels, aborting.
  3. Springboot-实现热部署
  4. 草莓甜品海报设计,甜出画面,受得住诱惑么?
  5. 统计php代码执行情况,PHP代码执行函数总结
  6. Android 硬编码
  7. DSP28335加密问题
  8. Oracle数据库优化的方法
  9. 计算机技术对艺术设计的影响,计算机对艺术设计有何影响
  10. 2020年度十大高薪岗位出炉!程序员霸榜!
  11. AOP底层实现原理、基于注解的AOP编程、AOP开发中的一个坑 打卡第八天
  12. Druid未授权漏洞实战利用
  13. 0开始学py爬虫(学习笔记)(Scrapy框架)(爬取职友集招聘信息)
  14. 人人都是首席质量官--读后感
  15. C语言abs函数与fabs函数,函数abs 和fabs
  16. Windows Server 2012 和 System Center 2012 SP1,Virtual Machine Manager 中启用的软件定义的网络
  17. linux从零基础开始
  18. 【IDEA】IDEA常用配置
  19. 多边形最小外接矩形 旋转卡壳
  20. 如何做到四位验证码更简洁的生成?

热门文章

  1. 利用dom4j将实体类转换为对应的xml报文
  2. Linux shell 学习笔记(9)— 循环语句(for、while)以及更改字段分隔符
  3. 奇异值分解与最小二乘问题 线性回归
  4. Bert系列(三)——源码解读之Pre-train
  5. LeetCode简单题之杨辉三角 II
  6. 如何使用TensorCores优化卷积
  7. 2020年人工智能汽车将出台多项标准
  8. 高精地图与自动驾驶(下)
  9. 零起点学算法11——求梯形面积
  10. Linux下安装 boost 库