关于线程锁

场景:

 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;
    });
}

 

posted @ 2020-01-08 14:29  流年sugar  阅读(155)  评论(0编辑  收藏  举报