class Program
{
static private bool done;
static void Main(string[] args)
{
Thread t = new Thread(Go);
t.Start();
Go();
}
static void Go()
{
//Console.WriteLine("1");
if (!done)
{
Console.WriteLine("Done");
done = true;
Console.WriteLine("2");
}
}
}
该程序的运行结果是
Done
2
Done
2
如果去掉注释,运行结果就变成:
1
Done
2
1
求解释为什么?
线程c#
{
static private bool done;
static void Main(string[] args)
{
Thread t = new Thread(Go);
t.Start();
Go();
}
static void Go()
{
//Console.WriteLine("1");
if (!done)
{
Console.WriteLine("Done");
done = true;
Console.WriteLine("2");
}
}
}
该程序的运行结果是
Done
2
Done
2
如果去掉注释,运行结果就变成:
1
Done
2
1
求解释为什么?
线程c#
执行结果还变成了
Done
Done
Done
Done
了呢
只输出一个Done
你这个也只是一个两个线程 调试起来也还可以 你可以单步走试一下!!!
应该是线程的调用顺序不同导致的。因为线程是由操作系统调度,每次哪个线程在前面可以不同。你把代码改成class Program
{
static private bool done;
static void Main(string[] args)
{
//Thread t = new Thread(Go);
// t.Start();
Go();
Go();
Console.ReadLine();
}
static void Go()
{
// Console.WriteLine("1");
if (!done)
{
Console.WriteLine(done.ToString());
done = true;
Console.WriteLine("2");
}
}
}
看看运行结果 就知道了。
应该是线程的调用顺序不同导致的。因为线程是由操作系统调度,每次哪个线程在前面可以不同。你把代码改成class Program
{
static private bool done;
static void Main(string[] args)
{
//Thread t = new Thread(Go);
// t.Start();
Go();
Go();
Console.ReadLine();
}
static void Go()
{
// Console.WriteLine("1");
if (!done)
{
Console.WriteLine(done.ToString());
done = true;
Console.WriteLine("2");
}
}
}
看看运行结果 就知道了。
也就是说是因为线程不在内存中调用,所以不会影响done的值是吗?
应该是线程的调用顺序不同导致的。因为线程是由操作系统调度,每次哪个线程在前面可以不同。你把代码改成class Program
{
static private bool done;
static void Main(string[] args)
{
//Thread t = new Thread(Go);
// t.Start();
Go();
Go();
Console.ReadLine();
}
static void Go()
{
// Console.WriteLine("1");
if (!done)
{
Console.WriteLine(done.ToString());
done = true;
Console.WriteLine("2");
}
}
}
看看运行结果 就知道了。
也就是说是因为线程不在内存中调用,所以不会影响done的值是吗?目前我也就知道这么多了,太高深的也不明白,也不敢胡乱回答。