using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;namespace MonitorTest
{
    class Class1
    {
        static object _lock = new object();
        static int _count;        static void Main(string[] args)
        {
            _count = 100;            Thread T1 = new Thread(AA);
            T1.Name = "A";
            T1.IsBackground = true;
            Thread T2 = new Thread(ABC);
            T2.Name = "B";
            T2.IsBackground = true;
            T1.Start();
            T2.Start();
            T1.Join();
            T2.Join();
            Console.WriteLine("结束");
        }        static void AA()
        {
            while (true)
            {
                A();
            }
        }        static void A()
        {
            lock (_lock)
            {
                while (_count <= 0) Monitor.Wait(_lock, Timeout.Infinite);
                _count--;
                Console.WriteLine(_count);
            }
        }        static void ABC()
        {
            
            lock (_lock)
            {
                Console.WriteLine("当前线程是:" + Thread.CurrentThread.Name);
                Thread.Sleep(5000);
                Console.WriteLine("郁闷");
                _count = 10;
                Monitor.Pulse(_lock);
            }
        }
    }
}为什么 A() 没有一直运行?  奇怪的是 我吧 Thread.Sleep(5000); 放到 lock外面 A() 就能运行了!!, ABC() 不是只有线程 B线程才访问的吗?难道会影响到A线程? 麻烦大家帮忙解释下!!!

解决方案 »

  1.   

    我刚刚用你的代码测试了一下,A是可以运行的,只是要等5秒针,因为A线程和B线程都用了锁_lock,出现了A等待B释放锁的情况,最后A线程阻塞在Monitor.Wait(_lock, Timeout.Infinite); 
    因为在A被阻塞的时候B已经执行过 Monitor.Pulse(_lock)。
      

  2.   

    你把Thread.Sleep放在外面也是最后阻塞在Monitor.Wait(_lock, Timeout.Infinite); ,因为Monitor.Pulse(_lock)。早已经做过了。
      

  3.   

    谢谢我想在次问下 为什么 A 要等 B的 lock 释放锁呢?B的 lock 不是只针对 B线程吗?  A的 lock 不是只针对 A线程吗?当执行到 B的时候 不是 只锁B线程吗?请赐教,本人初学
      

  4.   

    lock是不是基于线程的,而是基于你lock到什么对象上。
    像你的代码  lock (_lock) 
    我们可以把_lock想象成一个一面旗,只有拿着旗的线程才能执行。
    因此B进入lock段,拿了旗,执行。这时候A没法拿旗,因为只有一面旗,因此只能等B执行完lock段,释放旗。