线程同步的方法之lock
先看一个简单的例子
namespace _005进程同步lock
{
class Program
{
static int val1 = 0; //两个线程都操作的一个静态变量
static void Main(string[] args)
{
//线程t1每隔一毫秒给val1++ 执行1000次
Thread t1 = new Thread((() =>
{
for (int i = 0; i < 1000; i++)
{
val1++;
Thread.Sleep(1);
}
}));
t1.Start();
//线程t2每隔一毫秒给val1++ 执行1000次
Thread t2 = new Thread((() =>
{
for (int i = 0; i < 1000; i++)
{
val1++;
Thread.Sleep(1);
}
}));
t2.Start();
t1.Join();//等待线程t1结束
t2.Join();//等待线程t2结束
//while (t1.IsAlive){ }
//while (t2.IsAlive){ }
Console.WriteLine(val1);//打印结果
}
}
}
这里有两个线程并发为一个变量++1000次,如果没有同步手段的话就可能出现这种情况:“进程t1读出变量val1的值为99,然后为它++,将++后的结果100赋值给变量val1,可能这个时候线程t2也已经读出这个99的值并且++了好几次变成了105,此时线程t1再去给val1赋值时就让线程t2干的活白做了!”
现在使用lock来解决这个问题
namespace _005进程同步lock
{
class Program
{
#region 同步问题的引入
/*
static int val1 = 0; //两个线程都操作的一个静态变量
static void Main(string[] args)
{
//线程t1每隔一毫秒给val1++ 执行1000次
Thread t1 = new Thread((() =>
{
for (int i = 0; i < 1000; i++)
{
val1++;
Thread.Sleep(1);
}
}));
t1.Start();
//线程t2每隔一毫秒给val1++ 执行1000次
Thread t2 = new Thread((() =>
{
for (int i = 0; i < 1000; i++)
{
val1++;
Thread.Sleep(1);
}
}));
t2.Start();
t1.Join();//等待线程t1结束
t2.Join();//等待线程t2结束
//while (t1.IsAlive){ }
//while (t2.IsAlive){ }
Console.WriteLine(val1);//打印结果
}
*/
#endregion
#region 使用lock解决同步问题
static int val1 = 0; //两个线程都操作的一个静态变量
static object locker = new object(); //叫什么都可以
static void Main(string[] args)
{
//线程t1每隔一毫秒给val1++ 执行1000次
Thread t1 = new Thread((() =>
{
for (int i = 0; i < 1000; i++)
{
lock (locker)
{
val1++;
}
Thread.Sleep(1);
}
}));
t1.Start();
//线程t2每隔一毫秒给val1++ 执行1000次
Thread t2 = new Thread((() =>
{
for (int i = 0; i < 1000; i++)
{
lock (locker)
{
val1++;
}
Thread.Sleep(1);
}
}));
t2.Start();
t1.Join();//等待线程t1结束
t2.Join();//等待线程t2结束
//while (t1.IsAlive){ }
//while (t2.IsAlive){ }
Console.WriteLine(val1);//打印结果
}
#endregion
}
}
此时同步问题就解决了!