很久之前的面试就遇到过关于Monitor的一道笔试题,虽然很简单,但是由于我无知啊,基础差,又不上进,所以对很多东西的认识也很肤浅,就像之前人家形容的一部分人——只是工作经验丰富,会写一些代码,会用一些技术,但是却不知道为什么这么写,为什么这么用,这一部分人就包括我,
下面是借用的别人的代码,只是想借用这个代码让自己以后回来翻看时能清楚一些:
using System.Threading;
public class Program
{
static object ball = new object();
public static void Main()
{
Thread threadPing = new Thread(ThreadPingProc);
Thread threadPong = new Thread(ThreadPongProc);
threadPing.Start();
threadPong.Start();
System.Console.ReadLine();
}
static void ThreadPongProc()
{
System.Console.WriteLine("ThreadPong: Hello!");
lock (ball)
for (int i = 0; i < 5; i++)
{
System.Console.WriteLine("ThreadPong: Pong ");
Monitor.Pulse(ball);
Monitor.Wait(ball);
}
System.Console.WriteLine("ThreadPong: Bye!");
}
static void ThreadPingProc()
{
System.Console.WriteLine("ThreadPing: Hello!");
lock (ball)
for (int i = 0; i < 5; i++)
{
System.Console.WriteLine("ThreadPing: Ping ");
Monitor.Pulse(ball);
Monitor.Wait(ball);
}
System.Console.WriteLine("ThreadPing: Bye!");
}http://write.blog.csdn.net/postedit
}
![](http://hi.csdn.net/attachment/201201/11/0_1326262638D2XM.gif)
![](http://hi.csdn.net/attachment/201201/11/0_13262627055S0b.gif)
![](http://hi.csdn.net/attachment/201201/11/0_1326262931nAXP.gif)
上述三张图是上述代码执行多次的结果,可以看出threadPing和ThreadPong这两个线程并不是谁先Start就是谁先执行,而是由操作系统调度来决定的,
Monitor中有两个队列的概念:ready队列和waiting队列,如果线程A执行了Monitor.Wait(),那么ready队列中排第一的线程就会获得锁,同时线程A进入waiting队列的队尾,如果线程B执行了Monitor.Pulse(),那么waiting队列中排第一的线程就会进入ready队列,