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

C# lock關(guān)鍵字?jǐn)⑹?/h1>

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

C#語(yǔ)言有很多值得學(xué)習(xí)的地方,這里我們主要介紹C# lock關(guān)鍵字,包括介紹Monitor 類鎖定一個(gè)對(duì)象等方面。

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

lock(expression) statement_block

expression代表你希望跟蹤的對(duì)象,通常是對(duì)象引用。
◆如果你想保護(hù)一個(gè)類的實(shí)例,一般地,你可以使用this;
◆如果你想保護(hù)一個(gè)靜態(tài)變量(如互斥代碼段在一個(gè)靜態(tài)方法內(nèi)部),一般使用類名就可以了。

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

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

示例如下:

  1. using System;  
  2. using System.Threading;  
  3.  
  4. namespace ThreadSimple  
  5. {  
  6. internal class Account   
  7. {  
  8. int balance;  
  9. Random r = new Random();  
  10.  
  11. internal Account(int initial)   
  12. {  
  13. balance = initial;  
  14. }   
  15. internal int Withdraw(int amount)   
  16. {  
  17. if (balance < 0)  
  18. {  
  19. //如果balance小于0則拋出異常  
  20. throw new Exception("Negative Balance");  
  21. }  
  22. //下面的代碼保證在當(dāng)前線程修改balance的值完成之前  
  23. //不會(huì)有其他線程也執(zhí)行這段代碼來(lái)修改balance的值  
  24. //因此,balance的值是不可能小于0 的  
  25. lock (this)  
  26. {  
  27. Console.WriteLine("Current Thread:"+Thread.CurrentThread.Name);  
  28. //如果沒(méi)有l(wèi)ock關(guān)鍵字的保護(hù),那么可能在執(zhí)行完if的條件判斷之后  
  29. //另外一個(gè)線程卻執(zhí)行了balancebalance=balance-amount修改了balance的值  
  30. //而這個(gè)修改對(duì)這個(gè)線程是不可見(jiàn)的,所以可能導(dǎo)致這時(shí)if的條件已經(jīng)不成立了  
  31. //但是,這個(gè)線程卻繼續(xù)執(zhí)行balancebalance=balance-amount,所以導(dǎo)致balance可能小于0  
  32. if (balance >= amount)   
  33. {  
  34. Thread.Sleep(5);  
  35. balancebalance = balance - amount;  
  36. return amount;  
  37. }   
  38. else   
  39. {  
  40. return 0; // transaction rejected  
  41. }  
  42. }  
  43. }  
  44. internal void DoTransactions()   
  45. {  
  46. for (int i = 0; i < 100; i++)   
  47. Withdraw(r.Next(-50, 100));  
  48. }  
  49. }   
  50. internal class Test   
  51. {  
  52. static internal Thread[] threads = new Thread[10];  
  53. public static void Main()   
  54. {  
  55. Account acc = new Account (0);  
  56. for (int i = 0; i < 10; i++)   
  57. {  
  58. Thread t = new Thread(new ThreadStart(acc.DoTransactions));  
  59. threads[i] = t;  
  60. }  
  61. for (int i = 0; i < 10; i++)   
  62. threads[i].Name=i.ToString();  
  63. for (int i = 0; i < 10; i++)   
  64. threads[i].Start();  
  65. Console.ReadLine();  
  66. }  
  67. }  

Monitor 類鎖定一個(gè)對(duì)象

當(dāng)多線程公用一個(gè)對(duì)象時(shí),也會(huì)出現(xiàn)和公用代碼類似的問(wèn)題,這種問(wèn)題就不應(yīng)該使用C# lock關(guān)鍵字了,這里需要用到System.Threading中的一個(gè)類Monitor,我們可以稱之為監(jiān)視器,Monitor提供了使線程共享資源的方案。

Monitor類可以鎖定一個(gè)對(duì)象,一個(gè)線程只有得到這把鎖才可以對(duì)該對(duì)象進(jìn)行操作。對(duì)象鎖機(jī)制保證了在可能引起混亂的情況下一個(gè)時(shí)刻只有一個(gè)線程可以訪問(wèn)這個(gè)對(duì)象。 Monitor必須和一個(gè)具體的對(duì)象相關(guān)聯(lián),但是由于它是一個(gè)靜態(tài)的類,所以不能使用它來(lái)定義對(duì)象,而且它的所有方法都是靜態(tài)的,不能使用對(duì)象來(lái)引用。下面代碼說(shuō)明了使用Monitor鎖定一個(gè)對(duì)象的情形:

  1. ......  
  2.  
  3. Queue oQueue=new Queue();  
  4.  
  5. ......  
  6.  
  7. Monitor.Enter(oQueue);  
  8.  
  9. ......//現(xiàn)在oQueue對(duì)象只能被當(dāng)前線程操縱了  
  10.  
  11. Monitor.Exit(oQueue);//釋放鎖  

如上所示,當(dāng)一個(gè)線程調(diào)用Monitor.Enter()方法鎖定一個(gè)對(duì)象時(shí),這個(gè)對(duì)象就歸它所有了,其它線程想要訪問(wèn)這個(gè)對(duì)象,只有等待它使用 Monitor.Exit()方法釋放鎖。為了保證線程最終都能釋放鎖,你可以把Monitor.Exit()方法寫在try-catch- finally結(jié)構(gòu)中的finally代碼塊里。

【編輯推薦】

  1. C# GreetPeople方法
  2. C# Hashtable對(duì)象分析
  3. 常用C# Arraylist的介紹
  4. C# Observer設(shè)計(jì)模式
  5. C#交錯(cuò)數(shù)組淺析
責(zé)任編輯:佚名 來(lái)源: 博客園
相關(guān)推薦

2009-08-13 13:04: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#編程語(yǔ)言

2011-06-14 13:26:27

volatile

2022-01-10 18:11:42

C語(yǔ)言應(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
點(diǎn)贊
收藏

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