描述C# lock关键字

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

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

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#基础概念学习笔记
责任编辑:佚名 来源: IT168
相关推荐

2009-08-26 15:16:29

C# lock关键字

2009-09-02 09:24:03

C# this关键字

2009-08-21 14:58:56

C# this关键字

2009-08-06 17:52:23

C#增加that关键字

2009-08-13 17:44:34

C# using关键字

2009-08-21 14:47:59

C# base关键字

2009-08-21 14:16:35

C# New关键字

2009-07-31 16:34:17

dynamicC# 4.0

2009-09-01 15:25:04

C# default关

2024-06-04 17:02:38

newC#编程语言

2009-08-13 09:49:16

C#关键字

2011-06-14 13:26:27

volatile

2022-01-10 18:11:42

C语言应用技巧

2024-05-29 14:09:00

C#编程this

2011-07-14 23:14:42

C++static

2024-07-09 08:00:48

C#var​关键字

2011-06-21 09:50:51

volatile

2023-11-19 22:52:42

2010-01-26 14:35:11

C++关键字

2009-08-26 09:58:22

C#关键字
点赞
收藏

51CTO技术栈公众号