自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

描述C# lock關(guān)鍵字

開發(fā) 后端
本文介紹C# lock關(guān)鍵字,C#提供了一個關(guān)鍵字lock,它可以把一段代碼定義為互斥段(critical section),互斥段在一個時刻內(nèi)只允許一個線程進入執(zhí)行,而其他線程必須等待。

每個線程都有自己的資源,但是代碼區(qū)是共享的,即每個線程都可以執(zhí)行相同的函數(shù)。這可能帶來的問題就是幾個線程同時執(zhí)行一個函數(shù),導(dǎo)致數(shù)據(jù)的混亂,產(chǎn)生不可預(yù)料的結(jié)果,因此我們必須避免這種情況的發(fā)生。

C#提供了一個關(guān)鍵字lock,它可以把一段代碼定義為互斥段(critical section),互斥段在一個時刻內(nèi)只允許一個線程進入執(zhí)行,而其他線程必須等待。在C# lock關(guān)鍵字定義如下:

lock(expression) statement_block

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

如果你想保護一個類的實例,一般地,你可以使用this;如果你想保護一個靜態(tài)變量(如互斥代碼段在一個靜態(tài)方法內(nèi)部),一般使用類名就可以了。

而statement_block就是互斥段的代碼,這段代碼在一個時刻內(nèi)只可能被一個線程執(zhí)行。

下面是一個使用C# lock關(guān)鍵字的典型例子,在注釋里說明了C# lock關(guān)鍵字的用法和用途。

示例如下:

  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. //下面的代碼保證在當(dāng)前線程修改balance的值完成之前  
  24. //不會有其他線程也執(zhí)行這段代碼來修改balance的值  
  25. //因此,balance的值是不可能小于0的  
  26. lock(this)  
  27. {  
  28. Console.WriteLine("CurrentThread:"+Thread.CurrentThread.Name);  
  29. //如果沒有l(wèi)ock關(guān)鍵字的保護,那么可能在執(zhí)行完if的條件判斷之后  
  30. //另外一個線程卻執(zhí)行了balancebalance=balance-amount修改了balance的值  
  31. //而這個修改對這個線程是不可見的,所以可能導(dǎo)致這時if的條件已經(jīng)不成立了  
  32. //但是,這個線程卻繼續(xù)執(zhí)行balancebalance=balance-amount,所以導(dǎo)致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#結(jié)構(gòu)體的特點淺析
  2. 介紹C#窗體拖動事件
  3. C#讀取Excel遇到無法讀取的解決方法
  4. 概述C#.NET操作XML
  5. C#基礎(chǔ)概念學(xué)習(xí)筆記
責(zé)任編輯:佚名 來源: IT168
相關(guān)推薦

2009-08-26 15:16:29

C# lock關(guān)鍵字

2009-09-02 09:24:03

C# this關(guān)鍵字

2009-08-21 14:58:56

C# this關(guān)鍵字

2009-08-06 17:52:23

C#增加that關(guān)鍵字

2009-08-13 17:44:34

C# using關(guān)鍵字

2009-08-21 14:47:59

C# base關(guān)鍵字

2009-08-21 14:16:35

C# New關(guān)鍵字

2009-07-31 16:34:17

dynamicC# 4.0

2009-09-01 15:25:04

C# default關(guān)

2024-12-26 00:28:59

C#base?關(guān)鍵字

2024-06-04 17:02:38

newC#編程語言

2011-06-14 13:26:27

volatile

2022-01-10 18:11:42

C語言應(yīng)用技巧

2025-01-22 08:06:38

C#yield數(shù)據(jù)迭代

2009-08-13 09:49:16

C#關(guān)鍵字

2024-07-09 08:00:48

C#var?關(guān)鍵字

2024-05-29 14:09:00

C#編程this

2011-06-21 09:50:51

volatile

2023-11-19 22:52:42

2011-07-14 23:14:42

C++static
點贊
收藏

51CTO技術(shù)棧公眾號