互斥锁、线程同步
using System;
using System.Threading.Tasks;
class Program
{
// 共享变量(多个线程都会改它)
static int count = 0;
static void Main()
{
// 两个线程同时 count++
Task t1 = Task.Run(Add);
Task t2 = Task.Run(Add);
Task.WaitAll(t1, t2);
// 预期结果:2
// 真实结果:可能是 1,可能是 2(乱了!)
Console.WriteLine("最终结果:" + count);
}
static void Add()
{
count++; // 这行代码 线程不安全!
}
}
t1 和 t2 是两个任务(两个人)
但它们改的是【同一个】 count!
————————————————————————————————————————————————————
using System;
using System.Threading.Tasks;
class Program
{
static int count = 0;
static object myLock = new object(); // 锁对象
static void Main()
{
// 1. 创建任务t1
Task t1 = Task.Run(Add);
// 2. 创建任务t2
Task t2 = Task.Run(Add);
// 3. 主线程等待 t1、t2 全部完成
Task.WaitAll(t1, t2);
// 4. 打印结果
Console.WriteLine(count);
}
static void Add()
{
// 5. 加锁(同一时间只能一个线程进)
lock (myLock)
{
// 6. count++
count++;
}
// 7. 解锁,下一个线程可以进
}
}
lock 会让多个线程排队执行,不会同时修改数据,所以结果正确!

浙公网安备 33010602011771号