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 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算