在多线程编程中最难控制的就是对于同一个对象的并发访问(读写),如果同步没有做到位,可能导致意料之外的情况发生。
当所有线程共享一些变量或者对象时,一定要对改变此变量或对象的代码段加锁。
namespace CheckedAndUnchecked
{
class Program
private static int Count = 0;
static void Main(string[] args)
{
Thread thread1 = new Thread(new ThreadStart(Method));
thread1.Start();
Thread thread2 = new Thread(new ThreadStart(Method));
thread2.Start();
}
static void Method()
{
for(int i = 0; i < 10; i++)
{
int curVal = ++Count;
Thread.Sleep(100);
string output = string.Format("当前线程curVal :{0}, 当前Count:{1}", curVal, Count);
}
}
}
}
输出的curVal 和Count通常不等,说明Count被其他线程篡改了。要避免本线程正在使用的共享变量和对象被其他线程篡改,可以使用lock语句对该段程序加锁。
private static object MethodLock = new object();
static void Method()
{
for(int i = 0; i < 10; i++)
{
lock(MethodLock )
{
int curVal = ++Count;
Thread.Sleep(100);
string output = string.Format("当前线程curVal :{0}, 当前Count:{1}", curVal, Count);
}
}
}