Monitor類(lèi)與Lock語(yǔ)句相比,Monitor類(lèi)的主要優(yōu)點(diǎn)是:可以添加一個(gè)等待被鎖定的超時(shí)值。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),同仁企業(yè)網(wǎng)站建設(shè),同仁品牌網(wǎng)站建設(shè),網(wǎng)站定制,同仁網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,同仁網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
缺點(diǎn):開(kāi)銷(xiāo)非常大
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類(lèi) public void TheDoJob() { //鎖定 Monitor.Enter(obj); try { for (int i = 0; i < 10000; i++) { sc.state++; } } catch { } finally { //如果拋出異常也會(huì)就出鎖 //釋放鎖 Monitor.Exit(obj); } } //===========給Monitor類(lèi)設(shè)置超時(shí)時(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 { //如果超時(shí)會(huì)執(zhí)行下面代碼 Console.WriteLine("no"); } } } }
TheDoJob()
TheDoJob2()
=================================SpinLock(自旋鎖)
如果基于對(duì)象的的鎖定對(duì)象(Monitor)的系統(tǒng)開(kāi)銷(xiāo)由于垃圾回收而過(guò)高,就可以使用SpinLock結(jié)構(gòu)。如果有大量的鎖定,且鎖定的時(shí)間是非常短,自旋鎖就很有用。
*注意:
傳送SpinLock實(shí)例時(shí)要小心。因?yàn)镾pinLock定義為結(jié)構(gòu),把一個(gè)變量賦予另一個(gè)變量會(huì)創(chuàng)建副本??偸峭ㄟ^(guò)引用傳送SpinLock實(shí)例。
例子:
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]; //開(kāi)啟20個(gè)任務(wù) for (int i = 0; i < sum; i++) { t[i] = new Task(j.JobStart); t[i].Start(); } //等待20個(gè)任務(wù)全部結(jié)束 for (int i = 0; i < sum; i++) { t[i].Wait(); } Console.WriteLine(sc.State); Console.ReadKey(); } } //共享類(lèi) class ShareClass { public int State { get; set; } } class Job { //聲明一個(gè)自旋鎖,自旋鎖是一個(gè)結(jié)構(gòu)(不能為屬性) private SpinLock sl; //共享類(lèi) 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();//釋放鎖 } }); } } }