C#lock關鍵字是什么

這篇文章主要講解了“C# lock關鍵字是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C# lock關鍵字是什么”吧!

公司主營業務:網站設計、網站建設、移動網站開發等業務。幫助企業客戶真正實現互聯網宣傳,提高企業的競爭能力。創新互聯是一支青春激揚、勤奮敬業、活力青春激揚、勤奮敬業、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰,讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創新互聯推出貴州免費做網站回饋大家。

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

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

lock(expression) statement_block

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

而statement_block就是互斥段的代碼,這段代碼在一個時刻內只可能被一個線程執行。

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

示例如下:

using System;  using System.Threading;   namespace ThreadSimple  {  internal class Account   {  int balance;  Random r = new Random();   internal Account(int initial)   {  balance = initial;  }   internal int Withdraw(int amount)   {  if (balance < 0)  {  //如果balance小于0則拋出異常  throw new Exception("Negative Balance");  }  //下面的代碼保證在當前線程修改balance的值完成之前  //不會有其他線程也執行這段代碼來修改balance的值  //因此,balance的值是不可能小于0 的  lock (this)  {  Console.WriteLine("Current Thread:"+Thread.CurrentThread.Name);  //如果沒有lock關鍵字的保護,那么可能在執行完if的條件判斷之后  //另外一個線程卻執行了balancebalance=balance-amount修改了balance的值  //而這個修改對這個線程是不可見的,所以可能導致這時if的條件已經不成立了  //但是,這個線程卻繼續執行balancebalance=balance-amount,所以導致balance可能小于0  if (balance >= amount)   {  Thread.Sleep(5);  balancebalance = balance - amount;  return amount;  }   else   {  return 0; // transaction rejected  }  }  }  internal void DoTransactions()   {  for (int i = 0; i < 100; i++)   Withdraw(r.Next(-50, 100));  }  }   internal class Test   {  static internal Thread[] threads = new Thread[10];  public static void Main()   {  Account acc = new Account (0);  for (int i = 0; i < 10; i++)   {  Thread t = new Thread(new ThreadStart(acc.DoTransactions));  threads[i] = t;  }  for (int i = 0; i < 10; i++)   threads[i].Name=i.ToString();  for (int i = 0; i < 10; i++)   threads[i].Start();  Console.ReadLine();  }  }  }

Monitor 類鎖定一個對象

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

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

......   Queue oQueue=new Queue();   ......   Monitor.Enter(oQueue);   ......//現在oQueue對象只能被當前線程操縱了   Monitor.Exit(oQueue);//釋放鎖

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

感謝各位的閱讀,以上就是“C# lock關鍵字是什么”的內容了,經過本文的學習后,相信大家對C# lock關鍵字是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創新互聯,小編將為大家推送更多相關知識點的文章,歡迎關注!

分享文章:C#lock關鍵字是什么
分享URL:http://m.kartarina.com/article26/pihcjg.html

成都網站建設公司_創新互聯,為您提供靜態網站全網營銷推廣營銷型網站建設Google網站維護

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網站建設
主站蜘蛛池模板: 人妻中文字幕无码专区| 精品国产毛片一区二区无码| 精品无码免费专区毛片| 在线精品自偷自拍无码中文| 精品人妻系列无码人妻漫画| 国产午夜无码专区喷水| 亚洲AV无码一区二区三区牛牛| 国产成人无码a区在线观看视频免费 | 精品深夜AV无码一区二区| 无码少妇一区二区浪潮免费| 国产在线无码不卡影视影院| 亚洲日韩看片无码电影| 亚洲精品无码专区久久久| 毛片无码一区二区三区a片视频| 永久无码精品三区在线4| 无码GOGO大胆啪啪艺术| 国产成人综合日韩精品无码| 久久人妻无码中文字幕| 熟妇人妻系列aⅴ无码专区友真希| 亚洲综合无码一区二区痴汉| 中文字幕无码日韩专区| 亚洲国产精品无码久久久久久曰 | 国产a v无码专区亚洲av| 无码粉嫩虎白一线天在线观看| 精品无码成人片一区二区| 小SAO货水好多真紧H无码视频| 亚洲成A∨人片天堂网无码| 少妇特殊按摩高潮惨叫无码| 亚洲av无码片区一区二区三区| 国产成人综合日韩精品无码不卡| 国产精品亚洲一区二区无码| 亚洲AV永久无码天堂影院| 亚洲国产成人精品无码区在线秒播| 久久久久亚洲Av片无码v| 性无码专区无码片| 久久男人Av资源网站无码软件| 国产激情无码一区二区| 亚洲爆乳精品无码一区二区三区| 亚洲精品无码永久中文字幕| 无码欧精品亚洲日韩一区| 亚洲av无码乱码国产精品fc2|