下面的多线程源码,为什么每次执行出来的结果都不一样?///////////////////////////////////////////////////////////////////////
///描述:使用lock关键字
///////////////////////////////////////////////////////////////////////
using System;
using System.Threading;internal class Account
{
    int balance;
    Random r = new Random();    internal Account(int initial)
    {
        balance = initial;
    }    internal int Withdraw(int amount)
    {
        if (balance < 0)
        {
            throw new Exception("Negative Balance");
        }
        lock (this)
        {
            Console.WriteLine("Current Thread:" + Thread.CurrentThread.Name+",balance:"+balance+",amount:"+amount);            if (balance >= amount)
            {
                Thread.Sleep(5);
                balance = balance - amount;
                return amount;
            }
            else
            {
                return 0;
            }
        }
    }    internal void DoTransactions()
    {
        for (int i = 0; i < 100; i++)
        {
            Withdraw(r.Next(-50, 100));//要执行1000次吗?
        }
    }
}
internal class Test
{
    static internal Thread[] threads = new Thread[10];    public static void Main()
    {
        Account acc = new Account(0);        for (int i = 0; i < 10; i++)
        {
            Thread t = new Thread(new ThreadStart(acc.DoTransactions));
            threads[i] = t;
        }        for (int i = 0; i < 10; i++)
        {
            threads[i].Name = i.ToString();
        }        for(int i = 0; i <10; i++)
        {
            threads[i].Start();
        }        Console.ReadLine();
    }
}

解决方案 »

  1.   

    你的
    Random r = new Random();
    不是取随机数么?结果当然不一样了.
      

  2.   

     我不是说那个不一样,说是说执行线程的顺序不一样!
    例如有按程序执行的顺序我觉得首先执行的应该是 threads[0],但是执行结果并不是这样的!10个线程都有可能最先执行!
    我就是想问下为什么会出现这种情况?
      

  3.   

    现在不说结果,可能我表达的不清楚。我现在就想问,threads[0]是最先启动的,但是为什么执行结果不总是
    Current Thread:0,balance:***,amount:***
    ....
    ....
    我不知道你们运行过没?但是我感觉我已经说清楚了啊。
      

  4.   

    我在强调下我说的是线程执行的顺序不一样,而不是那些本来就希望不一样的Random.
      

  5.   

    那是因为相同优先级的线程是没有分先后的..而线程的执行主要是由系统来分配时间片,然后才交由CPU处理..而你的代面上面有
    Thread.Sleep(5);
    这会使线程睡眠5毫秒,,这5毫秒CPU可以处理其它的线程,包括你那其余的9个线程,或者系统线程或者其它应用程序线程...相同优先级的线程的思想没有谁先谁后的..比较狭义,但却可以实现同步...