qq_41235711 2019-04-25 23:50 采纳率: 66.7%
浏览 332
已采纳

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条回答

  • Your_Exios 2019-04-26 14:10
    关注

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题