您好,登錄后才能下訂單哦!
Monitor類與Lock語句相比,Monitor類的主要優點是:可以添加一個等待被鎖定的超時值。
缺點:開銷非常大
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類設置超時時間 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 { //如果超時會執行下面代碼 Console.WriteLine("no"); } } } }
TheDoJob()
TheDoJob2()
=================================SpinLock(自旋鎖)
如果基于對象的的鎖定對象(Monitor)的系統開銷由于垃圾回收而過高,就可以使用SpinLock結構。如果有大量的鎖定,且鎖定的時間是非常短,自旋鎖就很有用。
*注意:
傳送SpinLock實例時要小心。因為SpinLock定義為結構,把一個變量賦予另一個變量會創建副本。總是通過引用傳送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個任務 for (int i = 0; i < sum; i++) { t[i] = new Task(j.JobStart); t[i].Start(); } //等待20個任務全部結束 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 { //聲明一個自旋鎖,自旋鎖是一個結構(不能為屬性) private SpinLock sl; //共享類 private ShareClass sc; public Job(ShareClass _sc) { this.sc = _sc; this.sl = new SpinLock(); } public void JobStart() { //并行循環 Parallel.For(0, 10000, i => { bool spinToken = false; sl.Enter(ref spinToken);//鎖定 try { sc.State++; } finally { if (spinToken) sl.Exit();//釋放鎖 } }); } } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。