C# 多线程加锁简单示例
private void button8_Click(object sender, EventArgs e)
{
//for (int i = 0; i < 5; i++)
//{
// int k = i;
// (5);
// (() =>
// {
// ($"This is i={i} k={k} Start {}");
// (200);
// ($"This is i={i} k={k} End>>>>> {}");
// });
//}
List<int> intList = new List<int>();
for (int i = 0; i < 10000; i++)
{
Task.Run(() =>//多线程之后,结果变成小于10000,有数据丢失了
{
// (LOCK); 和lock原理一样
lock(LOCK)
{
intList.Add(i);
}
// (LOCK);
});
}
//多线程安全问题:一段代码,单线程执行和多线程执行结果不一致,就表明有线程安全问题
//加lock 就能解决线程安全问题--就是单线程化 --LOCK 就是保证方法块任意时刻只有一个线程能进去,其他线程就排队
//Lock原理 -- 语法糖 --等于Monitor ---锁定一个内存引用地址 ---所以不能是值类型 -- 也不能是null
Thread.Sleep(5000);
Console.WriteLine(intList.Count);
}
//private 防止外面访问, static 唯一只有一个 readonly 避免地址被修改 引用失效影响锁
private static readonly object LOCK = new object();