Monitor類與Lock語句相比,Monitor類的主要優(yōu)點是:可以添加一個等待被鎖定的超時值。
成都創(chuàng)新互聯(lián)公司主營橋西網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,APP應(yīng)用開發(fā),橋西h5微信小程序開發(fā)搭建,橋西網(wǎng)站營銷推廣歡迎橋西等地區(qū)企業(yè)咨詢缺點:開銷非常大
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { ShareClass sc = new ShareClass(); Job j=new Job (sc); Task[] ts=new Task[20]; for (int i = 0; i < 20; i++) { ts[i] = new Task(j.TheDoJob2); ts[i].Start(); } for (int i = 0; i < 20; i++) { ts[i].Wait(); } Console.WriteLine(sc.state); Console.ReadKey(); } } class ShareClass { public int state { get; set; } } class Job { ShareClass sc { get; set; } private object obj = new object(); public Job(ShareClass s) { sc = s; } //==========普通的Monitor類 public void TheDoJob() { //鎖定 Monitor.Enter(obj); try { for (int i = 0; i < 10000; i++) { sc.state++; } } catch { } finally { //如果拋出異常也會就出鎖 //釋放鎖 Monitor.Exit(obj); } } //===========給Monitor類設(shè)置超時時間 public void TheDoJob2() { bool yesno=false; //鎖定 Monitor.TryEnter(obj, 100, ref yesno); if (yesno) { for (int i = 0; i < 10000; i++) { sc.state++; } Console.WriteLine("yes"); //釋放鎖 Monitor.Exit(obj); } else { //如果超時會執(zhí)行下面代碼 Console.WriteLine("no"); } } } }
TheDoJob()
TheDoJob2()
=================================SpinLock(自旋鎖)
如果基于對象的的鎖定對象(Monitor)的系統(tǒng)開銷由于垃圾回收而過高,就可以使用SpinLock結(jié)構(gòu)。如果有大量的鎖定,且鎖定的時間是非常短,自旋鎖就很有用。
*注意:
傳送SpinLock實例時要小心。因為SpinLock定義為結(jié)構(gòu),把一個變量賦予另一個變量會創(chuàng)建副本。總是通過引用傳送SpinLock實例。
例子:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { ShareClass sc = new ShareClass(); Job j = new Job(sc); int sum = 20; Task[] t = new Task[sum]; //開啟20個任務(wù) for (int i = 0; i < sum; i++) { t[i] = new Task(j.JobStart); t[i].Start(); } //等待20個任務(wù)全部結(jié)束 for (int i = 0; i < sum; i++) { t[i].Wait(); } Console.WriteLine(sc.State); Console.ReadKey(); } } //共享類 class ShareClass { public int State { get; set; } } class Job { //聲明一個自旋鎖,自旋鎖是一個結(jié)構(gòu)(不能為屬性) private SpinLock sl; //共享類 private ShareClass sc; public Job(ShareClass _sc) { this.sc = _sc; this.sl = new SpinLock(); } public void JobStart() { //并行循環(huán) Parallel.For(0, 10000, i => { bool spinToken = false; sl.Enter(ref spinToken);//鎖定 try { sc.State++; } finally { if (spinToken) sl.Exit();//釋放鎖 } }); } } }
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
當(dāng)前文章:線程----Monitor(互斥鎖)類設(shè)置超時值-創(chuàng)新互聯(lián)
瀏覽路徑:http://muchs.cn/article6/cdddog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站制作、網(wǎng)站營銷、標(biāo)簽優(yōu)化、品牌網(wǎng)站制作、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)