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线程? 麻烦大家帮忙解释下!!!
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线程? 麻烦大家帮忙解释下!!!
因为在A被阻塞的时候B已经执行过 Monitor.Pulse(_lock)。
像你的代码 lock (_lock)
我们可以把_lock想象成一个一面旗,只有拿着旗的线程才能执行。
因此B进入lock段,拿了旗,执行。这时候A没法拿旗,因为只有一面旗,因此只能等B执行完lock段,释放旗。