private static int [] aa = new int[1000];
[STAThread]
static void Main(string[] args)
{
Thread thread_fst,thread_snd,thread_thd,thread_four,thread_five ;      //定义内部线程 thread_fst = new Thread(new ThreadStart(one));
thread_fst.Start(); thread_snd = new Thread(new ThreadStart(two));
thread_snd.Start(); thread_five = new Thread(new ThreadStart(five));
thread_five.Start(); Thread.Sleep(1000);
string sResult;
while(true)
{
Thread.Sleep(100);
}
}
static void one()
{
             int val = 1;
             int nCnt = 0;
while(true)
{
                 for (int i = 0; i < 100; i++)
                 {
                     aa[i] = val;
                 }
                                 Thread.Sleep(10);
}
} static void two()
{
             int val = 2;
             int nCnt = 0;
while(true)
{
                for (int i = 0; i < 100; i++)
                {
                    aa[i] = val;
                }
                Thread.Sleep(10);
} }
static void five()
{
            while (true)
            {
                string sResult = "";
                for (int i = 0; i < 100; i++)
                {
                    sResult += aa[i].ToString();
                }
                Console.WriteLine(sResult);
                Thread.Sleep(100);
            }
}
变量aa为啥不需要锁起来

解决方案 »

  1.   

    我预期print结果应该是乱的
    12222111122
    11122211111
    11222211111
    11111122222
    22222211111可是实际结果就象加锁访问对象一样
    111111111111
    222222222222
    111111111111
    111111111111
    22222222222
      

  2.   

    你这样试一下:static void one()
    {
    int val = 1;
    int nCnt = 0;
    while(true)
    {
        for (int i = 0; i < 100; i++)
             {
          aa[i] = val;
                          Thread.Sleep(10);         }
    }
    }
      

  3.   

    估计象我上边那样你就能得到预期的效果了,原因是每个线程一系列操作后才Sleep,很大的机会是一个线程操作时候另一个在睡觉.
      

  4.   

    "Thread.Sleep(10);"10ms对于现在的CPU来说是相当长的一个处理时间了,楼主你的程序肯定会碰到乱序输出的时候,只是你的运气不够好,我建议你缩短one()和two()的Sleep时间,而且不要设置相同,比如一个是5另一个是3,让休眠时间错开,观察输出久一些,总会碰到的
      

  5.   

    md,送错人了
    应该给jerryfos的
    jerryfos要接分的话,来留个话。
      

  6.   

    你没送错,实际上我说的和jerryfos是同一个道理. 你如果试一下我那种改法就能产生你预想的效果.
      

  7.   

    我们两人说的核心问题都是指你那个程序的写法由于 Sleep 的时间的原因上不容易让两个线程同时在一个输出的循环里修改数据.
      

  8.   

    jerryfos(想飞), 既然LZ觉得我得的那分应该是给你的, 要不我开个贴子把分还给你? 同意的话就说一声,算交个朋友.