c#中,通过System.Threading。监控类可以实现多线程中对某些代码块的同步访问,以确保数据的安全性。
对象obj=新对象();
监控在锁对象obj上会维持<强> 强>以及
T(1)是对当前获得了obj锁的<>强线程的引用强>(设此线程为CurrThread);,
(2) R为<强>就绪队列>强, 其上的线程已经准备好获取obj锁。当obj锁被CurrThread释放后(CurrThread可通过Monitor.Exit (obj)或 Monitor.Wait (obj)来释放其所获的obj锁)这些线程就会去竞争obj锁,获得obj锁的线程将被T引用; 线程调用Monitor.Enter (obj)或Monitor.TryEnter (obj)将会使该线程直接进入R队列。
(3) W为<强>等待队列>强,其上的线程是因为调用了Monitor.Wait (obj)而进入W队列的;<强>。强>当前获得obj锁的线程CurrThread调用Monitor.Pulse (obj)或Monitor.PulseAll (obj)后会使W队列中的第一个等待线程或所有等待线程被,这时被移至R队列的这些线程就有机会被操作系统直接调度执行,也就是有可以去竞争obj锁。
监控类中的重要方法:
方法名称描述
无效输入(对象obj)获得独占锁> private object lockObj =, new 对象(); ,,,,,,,private void 执行() ,,,,,,,{ ,,,,,,,,,,,Monitor.Enter (lockObj); ,,,,,,,,,,,for (int 小姐:=,0;,小姐:& lt;, 5,我+ +,) ,,,,,,,,,,,{ ,,,,,,,,,,,,,,,Console.WriteLine (“Thread 名字:”,+,Thread.CurrentThread.Name +,“,数:”,+,i); ,,,,,,,,,,,,,,,thread . sleep (new 随机(). next (5000)); ,,,,,,,,,,,} ,,,,,,,,,,,Monitor.Exit (lockObj); ,,,,,,,} ,,,,,,,public void 测试() ,,,,,,,{ ,,,,,,,,,,,Thread thread1 =, new 线程(new ThreadStart(执行); ,,,,,,,,,,,thread1.Name =,“Thread1”; ,,,,,,,,,,,thread1.Start (); ,,,,,,,,,,,Thread thread2 =, new 线程(new ThreadStart(执行); ,,,,,,,,,,,thread2.Name =,“Thread2”; ,,,,,,,,,,,thread2.Start (); ,,,,,,,,,,, ,,,,,,,,,,,thread1.Join (); ,,,,,,,,,,,thread2.Join (); ,,,,,,,}
输出结果:
线程名称:Thread1,数:0
线程名称:Thread1,数:1
线程名称:Thread1,数:2
线程名称:Thread1,数:3
线程名称:Thread1,数:4
线程名称:Thread2,数:0
线程名称:Thread2,数:1
线程名称:Thread2,数:2
线程名称:Thread2,数:3
线程名称:Thread2,数:4
例子2:
,,,,,,,,, private void Execute1 () ,,,,,,,{ ,,,,,,,,,,,if (Monitor.TryEnter (lockObj, 1000)) ,,,,,,,,,,,{ ,,,,,,,,,,,,,,,for (int 小姐:=,0;,小姐:& lt;, 5;,我+ +) ,,,,,,,,,,,,,,,{ ,,,,,,,,,,,,,,,,,,,Console.WriteLine (“Thread 名字:”,+,Thread.CurrentThread.Name +,“,数:”,+,i); ,,,,,,,,,,,,,,,,,,,thread . sleep (new 随机(). next (5000)); ,,,,,,,,,,,,,,,} ,,,,,,,,,,,,,,,Monitor.Exit (lockObj); ,,,,,,,,,,,} ,,,,,,,} ,,,,,,,public void Test1 () ,,,,,,,{ ,,,,,,,,,,,Thread thread1 =, new 线程(new ThreadStart (Execute1)); null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null nullc#监控类的使用