线程同步
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Thread1
{
class Program
{
static object obj = new object();
static int balance = 500;
static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(Debit));
t1.Start();
Thread t2 = new Thread(new ThreadStart(Credit));
t2.Start();
Console.ReadLine();
}
static void Credit()
{
for (int i = 0; i < 15; i++)
{
Monitor.Enter(obj);
balance += 100;
if (balance > 0)
Monitor.Pulse(obj);
Console.WriteLine("after crediting ,balance is{0}", balance);
Monitor.Exit(obj);
}
}
static void Debit()
{
for (int i = 0; i < 10; i++)
{
Monitor.Enter(obj);
if (balance == 0)
{
Monitor.Wait(obj);
}
balance -= 100;
Console.WriteLine("after debiting,balance is{0}", balance);
Monitor.Exit(obj);
}
}
}
}
在使用Monitor类的Wait()方法时,释放对象上的锁病进入对象的等待队列。等待对象的下一个线程获得锁。如果余额为0,取款线程就会放弃控制权,并且让存款线程获得锁。
代码中调用了Monitor类的Pulse()方法,从而可以向等待线程发送信号,表明锁现在以及被释放,并且将要传递回等待线程。
未调用Pulse()方法前,可能出现的错:在对余额执行5次取款操作之后,balance变成0.在第六次执行取款时,取款线程保存的锁被释放给存款线程。存款线程对余额执行15次存款操作,然后程序冻结。结果是存款线程以及结束执行,但是取款线程仍然在等待显示返回的锁。
解决后: