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条回答 默认 最新

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

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

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

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

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵