qq_41235711
qq_41235711
采纳率66.7%
2019-04-25 23:50 阅读 326
已采纳

java运行顺序搞不清楚

有三个线程,启动后都执行pass方法,然后将线程各自的name和address传递给pass方法,传的name和address值第一个字母都是相同的。count、name、address是共享变量。一直想不明白为什么下面两种写法得到的结果不一样,实在想不明白了,希望能有人帮帮忙,万分感谢!

public  void pass(String Pname,String Paddress){
        this.count++;
        this.Pname=Pname;
        this.Paddress=Paddress;
        check();
    }
private  void check(){
        if(Pname.charAt(0)!=Paddress.charAt(0))
            System.out.println("*******broken********"+toString());
    }

上面的pass方法调用和下面的有什么区别?在多线程不加pass方法不加synchronized的情况下为什么两者的运行情况完全不一样?

public  void pass(String Pname,String Paddress){
        this.count++;
        this.Pname=Pname;
        this.Paddress=Paddress;
        if(Pname.charAt(0)!=Paddress.charAt(0))
            System.out.println("*******broken********"+toString());
    }
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

2条回答 默认 最新

  • 已采纳
    qq_43682859 Your_Exios 2019-04-26 14:10

    哈哈哈,楼主,又遇到了~
    同刚刚那个问题,应该是this的问题
    第一个方法里面,那个Pname和Paddress,是方法内定义的,你的check()方法,没有传参进去,那么pass方法内定义的变量,是传不进入的
    所以check()方法拿到的值,应该是你的类成员变量的值
    但是第二个方法就不一样了,他方法内定义了局部变量,那么在同一方法中,Pname和Paddress的值,就是你前面定义的局部变量的值了

    我只是这么推测,感觉很可能是这样的,你可以打断点看看是不是这样的

    点赞 1 评论 复制链接分享
  • lhc2207221755 水田奈落 2019-04-26 11:40

    你看到的代码的顺序不一定是执行顺序

    点赞 评论 复制链接分享

相关推荐