Monitor、Lock使用示例

来源:互联网 发布:阿里云服务器抢票 编辑:程序博客网 时间:2024/05/16 17:07

很久之前的面试就遇到过关于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}

上述三张图是上述代码执行多次的结果,可以看出threadPing和ThreadPong这两个线程并不是谁先Start就是谁先执行,而是由操作系统调度来决定的,

Monitor中有两个队列的概念:ready队列和waiting队列,如果线程A执行了Monitor.Wait(),那么ready队列中排第一的线程就会获得锁,同时线程A进入waiting队列的队尾,如果线程B执行了Monitor.Pulse(),那么waiting队列中排第一的线程就会进入ready队列,

原创粉丝点击