c#监控类的使用

  

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   null

c#监控类的使用