关于线程锁
场景:
public void A() { lock (m)//数组m { B();//异步方法 m = newVal; } } public void B() { Task.Run(() => { var c = m.n; }); }
代码段A中存在一个异步的方法,此时c获取的不是当时的m值,而是m每次赋值后的新值(也就是每次获取的都是m下一次的值)
原因:B方法是异步方法,属于A以外的另一个线程,只有当线程A执行完以后,B方法所在的线程才能访问m数组而此时m的值已经变成下一次的值了。
解决方法:
1.将B方法写成同步方法
2.将B方法所用到的m(被锁住的)通过参数的方式传入,此时传入的就是当前m的地址,当m解锁后B方法就能使用m赋值前的值了
方法2的改造如下
public void A() { lock (m)//数组m { B(m);//异步方法 m = newVal; } } public void B(List<Dto> t) { Task.Run(() => { var c = t.n; }); }