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();
         }
        static void ThreadPongProc()
         {
            lock (ball)
              {
                for (int i = 0; i < 5; i++)
                {
                    System.Console.WriteLine("ThreadPong: Pong ");                  
                    Monitor.Pulse(ball);
                    Monitor.Wait(ball);
                }
              }
          }
        static void ThreadPingProc()
         {
            lock (ball)
              {
                for (int i = 0; i < 5; i++)
                  {
                     System.Console.WriteLine("ThreadPing: Ping ");                  
                     Monitor.Pulse(ball);
                     Monitor.Wait(ball);
                  }
               }
         }
     }我的问题是:
Lock关键字不是有获取锁、释放锁的功能吗?不是封装了try...finally语句吗?
对象锁释放后,队列线程自然就获得了对象锁,为什么还需要执行Pulse方法通知其他线程呢?

解决方案 »

  1.   

    如果没有Monitor.Pulse,那么lock下的循环就会执行到底,然后才退出lock。
    也就是说5个"ThreadPong: Pong"或5个"ThreadPing: Ping "会连续出现。而Monitor.Pulse则暂时交出控制权,使得Ping和Pong可能混合着出现。
      

  2.   

    不知道你用lock还用moniter是什么意思
      

  3.   

    +1其实用lock 的地方 都应该换成 Monitor用它的重载方法
      

  4.   

    我觉得
    Monitor.Pulse(ball);
      Monitor.Wait(ball);
    完全没必要,多余
      

  5.   

    或者使用[MethodImpl(MethodImplOptions.Synchronized)]特性  [MethodImpl(MethodImplOptions.Synchronized)]
      static void ThreadPongProc()
      {  
          for(int i = 0; i < 5; i++)
          {
              System.Console.WriteLine("ThreadPong: Pong ");   
      
          }
      }
      

  6.   

     [MethodImpl(MethodImplOptions.Synchronized)]啥东西?
    没看到过这种写法呢
      

  7.   

    那叫特性.
    上面的Monitor都可以去掉.
    直接用lock就可以了.
      

  8.   

    用lock 就不要用monitor了,两个都是加锁,常用monitor,因为lock最后还是编译为monitor。