注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

c# lock (obj) 与 lock (this) 区别  

2011-12-07 09:34:50|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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中的结果,也是我们不想要的。

 


转载:http://www.cnblogs.com/yuqilin/archive/2011/10/15/2213766.html

  评论这张
 
阅读(648)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017