比如有2个 线程同时访问变量 a 同时给他赋值++操作
//共享变量
int count = 0;
Thread t1 = new Thread(AddNumber);
Thread t2 = new Thread(AddNumber);
t1.Start();
t2.Start();
//方法用于阻塞调用线程,直到某个线程终止为止。当你想要等待另一个线程完成其任务后再继续执行时,这个方法非常有用。
t1.Join();
t2.Join();
Console.WriteLine( $"{count}");
private void AddNumber(){
for (int i = 0; i < 100000; i++){
lock (lockobj) {
count++;
}
}
}
那么这个时候 就会出现 count 可能 不是200000 ;
这个时候就需要在 count++ 变量赋值的地方 加锁解决
//锁
object lockobj=new object();
private void AddNumber(){
for (int i = 0; i < 100000; i++){
lock (lockobj) {
count++;
}
}
}
}
这个时候 结果就会是200000,不会存在 上面的结果两个线程同时 对一个变量的访问 导致线程安全
什么是线程安全?
线程安全
多个线程访问共享资源时,对共享资源的访问不会导致数据不一致或不可预期的结果
同步机制
用于协调和控制多个线程之间执行顺序和互斥访问共享资源
确保线程按照特定的顺序执行,避免竞态条件和数据不一致的问题
原子操作
在执行过程中不会被中断的操作。不可分割,要么完全执行,要么完全不执行,没有中间状态
在多线程环境下,原子操作能够保证数据的一致性和可靠性,避免出现竞态条件和数据竞争的问题