以一个程序来说明线程不同步所带来的问题
示例
代码语言:javascript复制 class Program
{
static void Main(string[] args)
{
Thread.CurrentThread.Name = "主线程--------------";
Program objDemo = new Program();
//创建一个新的线程
Thread objNewThread = new Thread(new ThreadStart(objDemo.ActionMethod));
objNewThread.Name = "子线程--------------";
objNewThread.Start();
objDemo.ActionMethod();
Console.ReadLine();
}
private int counter = 0;
private void ActionMethod()
{
for (int count = 1; count <= 10; count )
{
counter = count;
Console.WriteLine("{0}t{1}", Thread.CurrentThread.Name, counter);
}
}
}
结果如下
从上面的结果中可以看到主线程和子线程都在争夺ActionMethod方法,在实际项目中会引起很多问题,我们期望的效果应该是子线程调用完后主线程再调用。
解决方法
下面提供两种常用的解决方法 1.为方法添加lock关键字 lock关键字可以确保一次只有一个线程调用它。 lock关键字可以简单理解成代码块的“锁”。
代码语言:javascript复制 private void ActionMethod()
{
lock (this)
{
for (int count = 1; count <= 10; count )
{
counter = count;
Console.WriteLine("{0}t{1}", Thread.CurrentThread.Name, counter);
}
}
}
2.添加[MethodImpl(MethodImplOptions.Synchronized)]方法属性
代码语言:javascript复制 [MethodImpl(MethodImplOptions.Synchronized)]
private void ActionMethod()
{
for (int count = 1; count <= 10; count )
{
counter = count;
Console.WriteLine("{0}t{1}", Thread.CurrentThread.Name, counter);
}
}
我们看下修改后的效果
达到预期!