這篇文章主要講解了“C# lock關(guān)鍵字是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C# lock關(guān)鍵字是什么”吧!
公司主營業(yè)務(wù):網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出貴州免費(fèi)做網(wǎng)站回饋大家。
C#語言有很多值得學(xué)習(xí)的地方,這里我們主要介紹C# lock關(guān)鍵字,包括介紹Monitor 類鎖定一個對象等方面。
C#提供了一個lock關(guān)鍵字,它可以把一段代碼定義為互斥段(critical section),互斥段在一個時刻內(nèi)只允許一個線程進(jìn)入執(zhí)行,而其他線程必須等待。在C#中,C# lock關(guān)鍵字定義如下:
lock(expression) statement_block
expression代表你希望跟蹤的對象,通常是對象引用。
◆如果你想保護(hù)一個類的實(shí)例,一般地,你可以使用this;
◆如果你想保護(hù)一個靜態(tài)變量(如互斥代碼段在一個靜態(tài)方法內(nèi)部),一般使用類名就可以了。
而statement_block就是互斥段的代碼,這段代碼在一個時刻內(nèi)只可能被一個線程執(zhí)行。
下面是一個使用C# lock關(guān)鍵字的典型例子,在注釋里說明了C# lock關(guān)鍵字的用法和用途。
示例如下:
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"); } //下面的代碼保證在當(dāng)前線程修改balance的值完成之前 //不會有其他線程也執(zhí)行這段代碼來修改balance的值 //因此,balance的值是不可能小于0 的 lock (this) { Console.WriteLine("Current Thread:"+Thread.CurrentThread.Name); //如果沒有l(wèi)ock關(guān)鍵字的保護(hù),那么可能在執(zhí)行完if的條件判斷之后 //另外一個線程卻執(zhí)行了balancebalance=balance-amount修改了balance的值 //而這個修改對這個線程是不可見的,所以可能導(dǎo)致這時if的條件已經(jīng)不成立了 //但是,這個線程卻繼續(xù)執(zhí)行balancebalance=balance-amount,所以導(dǎo)致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 類鎖定一個對象
當(dāng)多線程公用一個對象時,也會出現(xiàn)和公用代碼類似的問題,這種問題就不應(yīng)該使用C# lock關(guān)鍵字了,這里需要用到System.Threading中的一個類Monitor,我們可以稱之為監(jiān)視器,Monitor提供了使線程共享資源的方案。
Monitor類可以鎖定一個對象,一個線程只有得到這把鎖才可以對該對象進(jìn)行操作。對象鎖機(jī)制保證了在可能引起混亂的情況下一個時刻只有一個線程可以訪問這個對象。 Monitor必須和一個具體的對象相關(guān)聯(lián),但是由于它是一個靜態(tài)的類,所以不能使用它來定義對象,而且它的所有方法都是靜態(tài)的,不能使用對象來引用。下面代碼說明了使用Monitor鎖定一個對象的情形:
...... Queue oQueue=new Queue(); ...... Monitor.Enter(oQueue); ......//現(xiàn)在oQueue對象只能被當(dāng)前線程操縱了 Monitor.Exit(oQueue);//釋放鎖
如上所示,當(dāng)一個線程調(diào)用Monitor.Enter()方法鎖定一個對象時,這個對象就歸它所有了,其它線程想要訪問這個對象,只有等待它使用 Monitor.Exit()方法釋放鎖。為了保證線程最終都能釋放鎖,你可以把Monitor.Exit()方法寫在try-catch- finally結(jié)構(gòu)中的finally代碼塊里。
感謝各位的閱讀,以上就是“C# lock關(guān)鍵字是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C# lock關(guān)鍵字是什么這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!