//using System.Threading;
for (int i = 1; i <= 10; i++)
{
Thread thread = new Thread(() => Console.WriteLine(i));
thread.Start();
}
/*
3
3
4
5
7
8
9
9
10
11
*/原本希望程序能输出数字1到10,每个数字输出一次,顺序可不固定,结果呢,完全不是预期的,但想想得出这样的结果并不奇怪,多线程类似于异步,这样就可能在执行某个线程时,i的值已经被修改了,分析上边结果可知,在执行线程1和线程2代码时,i的值已被赋值为3了。
第二版
//using System.Threading;
object obj = new object();
int counter = 0;
for (int i = 1; i <= 10; i++)
{
Thread thread = new Thread(() =>
{
lock (obj)
{
counter++;
}
Console.WriteLine(counter);
});
thread.Start();
}
/*
1
2
3
4
5
6
7
8
9
10
*/问题解决了吗?加个Thread.Sleep看下:
//using System.Threading;
object obj = new object();
int counter = 0;
for (int i = 1; i <= 10; i++)
{
Thread thread = new Thread(() =>
{
lock (obj)
{
counter++;
}
Thread.Sleep(1000);
Console.WriteLine(counter);
});
thread.Start();
}
/*
10
10
10
10
10
10
10
10
10
10
*/问题并没解决,原因和第一版类似,在执行前面9个线程的代码时,counter的值已被第10个线程改为10了。
正式版
//using System.Threading;
object obj = new object();
int counter = 0;
for (int i = 1; i <= 10; i++)
{
Thread thread = new Thread(() =>
{
int num = 0;
lock (obj)
{
num = ++counter;
}
Console.WriteLine(num);
});
thread.Start();
}
/*
1
2
3
4
5
6
7
8
9
10
*/编程心得
在多线程编程时,应避免在多个线程中修改和使用同一个变量的情形出现。
评论(0)
暂无评论。