关于线程锁

场景:

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;

});

}

原文地址:https://www.cnblogs.com/sugarwxx/p/12166437.html