电子课件本章常见错误.pptx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

本章常见错误本讲大纲:1、使用值类型进行线程同步的错误支持网站:2、多个线程调用同一静态方法的运行结果问题

使用值类型进行线程同步的错误(1)无论在什么环境和机制下编写多线程程序,都需要考虑线程同步的问题,因为很难找到同属于一个应用程序却又完全不相干的多线程。下面将演示使用值类型进行线程同步时容易出现的错误,实现过程如下:创建一个控制台应用程序,首先在应用程序下创建一个类文件SynchronValue.cs,该文件包含一个名称叫SynchronValue的类,其代码如下:publicclassSynchronValue{privateintsyn=0;//定义值类型的同步变量privateinti=0;publicvoidDoWork(objectstate){try{Monitor.Enter(syn);//使用值类型对象同步Console.WriteLine(i的值为:+i.ToString());i++;Thread.Sleep(100);//模拟其它的工作Console.WriteLine(i自增1后的值为:+i.ToString());Monitor.Exit(syn);//移除同步}catch(Exceptionex){throwex;}}}

使用值类型进行线程同步的错误(2)在控制台应用程序的入口方法Main中编写如下代码:staticvoidMain(string[]args){SynchronValuesv=newSynchronValue();for(inti=0;i5;i++)//5个线程同步测试{Threadthrd=newThread(sv.DoWork);thrd.Start();//开启线程}Thread.Sleep(1000);//休眠1秒钟,保证所有的内容都已输出到控制台}编译后运行程序,在运行时却出现如图所示的异常提示窗口,异常信息提示:“从不同步的代码块中调用了对象同步方法”。下面对上面的异常提示进行分析:.NET的线程同步机制是基于同步块实现的,在.NET的框架中,每个堆内的对象都会拥有一个同步索引字段,用来指向同步块的位置。值类型对象是分配在堆栈上的,也就是说值类型对象没有同步索引字段,所以直接使用值类型对象无法实现线程同步。具体应用到程序中,对值类型的变量使用lock关键字或者Monitor类的Enter方法和Exit方法会产生不一样的结果。对于lock关键字来说,使用值类型会直接导致一个编译错误,错误信息如图所示。

使用值类型进行线程同步的错误(3)但是如果使用Monitor类,编译器则无法检测出这一类的错误,和使用引用类型的情况一样,每次调用Monitor.Enter方法时,都会对值类型进行装箱,每一次装箱都会导致一个新的堆内对象的产生,所有的线程都在访问不同对象的同步块,导致线程同步完全失败。更为严重的是,当某个线程试图对值类型对象调用Monitor.Exit方法时,装箱同样会发生,这时就意味着程序尝试对一个没有分配同步块的对象进行同步退出,所以才会导致如上图所示的运行时异常。根据上面的分析可知,不可以使用值类型进行线程同步,所以解决方法是将SynchronValue类中的syn字段修改为引用类型,修改后的代码如下:publicclassSynchronValue{privateobjectsyn=newobject();//定义引用类型的同步变量privateinti=0;publicvoidDoWork(objectstate){…//方法中的其它代码}}

多个线程调用同一静态方法的运行结果问题(1)静态成员属于类,而不属于实例,通常使用类直接调用,而无法使用类的实例调用。由于静态成员的这些特性,使其给程序设计人员带来一种神秘感,同时也增加了一些人对静态成员的的诸多猜测。比如,静态方法效率比实例方法高、静态方法比实例方法占内存、多个线程同时调用静态方法,其运行结果可能不准确等等。下面的代

文档评论(0)

136****1820 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档