描述C 描述c罗的外貌
创始人
2024-04-29 03:30:17
0

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

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#基础概念学习笔记

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...