Java 是不是;如果;总是等待方法完成吗?

Java 是不是;如果;总是等待方法完成吗?,java,Java,我对Java相当陌生,有一个疑问需要澄清 使用如下代码: public int x; public int elaborateX(){ x = 0; setX(); x+=1; return x; } public void setX(){ //... //some workload here //... x = 5; } 据我所知,有可能(特别是如果方法setX()不仅仅是设置x)democratex()会返回“1” 在仔细

我对Java相当陌生,有一个疑问需要澄清

使用如下代码:

public int x;

public int elaborateX(){
    x = 0;
    setX();
    x+=1;
    return x;
}

public void setX(){
    //...
    //some workload here
    //...
    x = 5;
}
据我所知,有可能(特别是如果方法setX()不仅仅是设置x)democratex()会返回“1”

在仔细研究了这个问题之后,我知道线程可以用来防止“bug”,但我的问题是;以下操作是否总是等待setX()完成执行

public int x;

public int elaborateX(){
    x = 0;
    if(setX()){
       x+=1;
    };

    return x;
}

public boolean setX(){
    //...
    //some workload here
    //...
    x = 5;
    return true;
}
在这种情况下,exploadex()是否总是返回“6”

我这样问是因为我需要百分之百地确定,否则我将使用“适当的方法”而不是这个“技巧”

谢谢

是的


普通Java代码总是同步的。

如果两个不同的线程同时改变变量,您可能会遇到问题


但是,由于您的示例似乎只有一个线程,您可以安全地假设一切都将按顺序发生(即方法setX总是在任何后续指令之前完全完成)。

否,您已经看到Java和线程编程中的“已同步”。您已经熟悉另一种语言的线程编程了吗?

除非您使用多个线程,否则它不可能返回除6以外的任何内容

这就是线程的意义所在,每个操作都是一个接一个的线程化,没有操作的重新排序。(至少你看不到任何东西,虚拟机本身会进行各种疯狂的优化,但它一定不可见。)


但是,Java使用布尔运算符
|
&
,虽然它们不相关,但如果您没有准备好,可能会导致类似的问题。

您可以期望应用程序始终返回6(假设是单线程程序)

if语句必须在其条件块内执行代码,才能使程序正确分支。我不确定条件不完全执行的想法是从哪里来的,但我认为您可以看到,对于程序的确定性执行来说,它是如何存在问题的。我甚至不知道如果没有条件语句中的代码被完全执行/计算,if语句将如何分支

据我所知,这是有可能的(特别是如果方法setX() 做的不仅仅是设置x)detailurex()将返回“1”

只有在
setX
中生成一个新线程,这样您的
detachex
执行线程将继续将
x
作为1查找时,才会发生这种情况

在这种情况下,exploadex()是否总是返回“6”

否和是。这取决于您的实现。如果您在
setX
中生成一个新线程,那么在
detailEx
线程执行中,您将继续并发现
x
为1

您必须实现一种机制来等待
setX
完成并获得结果


这可能是通过定时等待/中断,也可能是通过
加入线程

假设一个线程,“据我所知,有可能(特别是如果方法setX()不仅仅是设置x)detailEx()会返回“1”。”是不正确的。是的,它会。在单线程应用程序(如上面的应用程序)中,可以预期返回6,因为每条指令在下一条指令之前都已完全执行。它是确定性的。