日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#lock關(guān)鍵字敘述

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

成都創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、克井網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5高端網(wǎng)站建設、商城建設、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站建設公司、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為克井等各大城市提供網(wǎng)站開發(fā)制作服務。

C#提供了一個lock關(guān)鍵字,它可以把一段代碼定義為互斥段(critical section),互斥段在一個時刻內(nèi)只允許一個線程進入執(zhí)行,而其他線程必須等待。在C#中,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. 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. //下面的代碼保證在當前線程修改balance的值完成之前  
  23. //不會有其他線程也執(zhí)行這段代碼來修改balance的值  
  24. //因此,balance的值是不可能小于0 的  
  25. lock (this)  
  26. {  
  27. Console.WriteLine("Current Thread:"+Thread.CurrentThread.Name);  
  28. //如果沒有l(wèi)ock關(guān)鍵字的保護,那么可能在執(zhí)行完if的條件判斷之后  
  29. //另外一個線程卻執(zhí)行了balancebalance=balance-amount修改了balance的值  
  30. //而這個修改對這個線程是不可見的,所以可能導致這時if的條件已經(jīng)不成立了  
  31. //但是,這個線程卻繼續(xù)執(zhí)行balancebalance=balance-amount,所以導致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 類鎖定一個對象

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

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

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

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


文章名稱:C#lock關(guān)鍵字敘述
網(wǎng)頁地址:http://www.5511xx.com/article/ccisioc.html