新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
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();//释放锁 } }); } } }