互斥锁、线程同步

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 会让多个线程排队执行,不会同时修改数据,所以结果正确!

posted @ 2026-04-02 18:49  菜鸟的奋斗军  阅读(7)  评论(0)    收藏  举报