场景:
A
{
locker(m)//数组m
{
B();//异步方法
m=newVal;
}
}
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的改造如下
A
{
locker(m)//数组m
{
B(m);//异步方法
m=newVal;
}
}
B(list t){
Task.Run(() =>
var c=t.n;
});
}