线程同步

代码
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次存款操作,然后程序冻结。结果是存款线程以及结束执行,但是取款线程仍然在等待显示返回的锁。

 

       

解决后:

 

posted @ 2010-12-04 17:31  celvin  阅读(222)  评论(0编辑  收藏  举报