zoukankan      html  css  js  c++  java
  • 关于线程锁

    场景:

    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;

    });

    }

  • 相关阅读:
    框架搭建相关
    MVC的优缺点
    java filter、listener、servlet
    java类反射
    oracle创建用户及赋权
    sql分组最大值相关
    oracle备份还原数据库
    Oracle创建DataBase Links
    linux 安装mysql
    网址收藏
  • 原文地址:https://www.cnblogs.com/sugarwxx/p/12166437.html
Copyright © 2011-2022 走看看