描述C# lock关键字

每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。

为郏县等地区用户提供了全套网页设计制作服务,及郏县网站建设行业解决方案。主营业务为网站制作、成都网站制作、郏县网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。在C# lock关键字定义如下:

lock(expression) statement_block

expression代表你希望跟踪的对象,通常是对象引用。

如果你想保护一个类的实例,一般地,你可以使用this;如果你想保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了。

而statement_block就是互斥段的代码,这段代码在一个时刻内只可能被一个线程执行。

下面是一个使用C# lock关键字的典型例子,在注释里说明了C# lock关键字的用法和用途。

示例如下:

 
 
 
  1. usingSystem;  
  2. usingSystem.Threading;  
  3.  
  4. namespaceThreadSimple  
  5. {  
  6. internalclassAccount  
  7. {  
  8. intbalance;  
  9. Randomr=newRandom();  
  10.  
  11. internalAccount(intinitial)  
  12. {  
  13. balance=initial;  
  14. }  
  15.  
  16. internalintWithdraw(intamount)  
  17. {  
  18. if(balance<0)  
  19. {  
  20. //如果balance小于0则抛出异常  
  21. thrownewException("NegativeBalance");  
  22. }  
  23. //下面的代码保证在当前线程修改balance的值完成之前  
  24. //不会有其他线程也执行这段代码来修改balance的值  
  25. //因此,balance的值是不可能小于0的  
  26. lock(this)  
  27. {  
  28. Console.WriteLine("CurrentThread:"+Thread.CurrentThread.Name);  
  29. //如果没有lock关键字的保护,那么可能在执行完if的条件判断之后  
  30. //另外一个线程却执行了balancebalance=balance-amount修改了balance的值  
  31. //而这个修改对这个线程是不可见的,所以可能导致这时if的条件已经不成立了  
  32. //但是,这个线程却继续执行balancebalance=balance-amount,所以导致balance可能小于0  
  33. if(balance>=amount)  
  34. {  
  35. Thread.Sleep(5);  
  36. balancebalance=balance-amount;  
  37. returnamount;  
  38. }  
  39. else  
  40. {  
  41. return0;//transactionrejected  
  42. }  
  43. }  
  44. }  
  45. internalvoidDoTransactions()  
  46. {  
  47. for(inti=0;i<100;i++)  
  48. Withdraw(r.Next(-50,100));  
  49. }  
  50. }  
  51.  
  52. internalclassTest  
  53. {  
  54. staticinternalThread[]threads=newThread[10];  
  55. publicstaticvoidMain()  
  56. {  
  57. Accountacc=newAccount(0);  
  58. for(inti=0;i<10;i++)  
  59. {  
  60. Threadt=newThread(newThreadStart(acc.DoTransactions));  
  61. threads[i]=t;  
  62. }  
  63. for(inti=0;i<10;i++)  
  64. threads[i].Name=i.ToString();  
  65. for(inti=0;i<10;i++)  
  66. threads[i].Start();  
  67. Console.ReadLine();  
  68. }  
  69. }  

【编辑推荐】

  1. C#结构体的特点浅析
  2. 介绍C#窗体拖动事件
  3. C#读取Excel遇到无法读取的解决方法
  4. 概述C#.NET操作XML
  5. C#基础概念学习笔记

当前名称:描述C# lock关键字
网页链接:http://www.shufengxianlan.com/qtweb/news38/267438.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联