“if”总是等待方法完成吗?

时间:2012-02-20 16:58:48

标签: 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),elaborateX()将返回“1”。

我知道在查看周围的问题后,Threads可以用来防止“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;
}

在这种情况下,elaborateX()总会返回“6”吗?

我在问,因为我需要100%确定,否则我将使用“正确的方法”而不是这个“技巧”。

由于

6 个答案:

答案 0 :(得分:2)

普通的Java代码始终是同步的。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

除非你使用多个线程,否则它不会返回6以外的任何东西。

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

然而,Java使用short-circuit evaluation布尔运算符||&&,虽然它们没有相关性,但如果你没有准备就会导致类似的问题。

答案 3 :(得分:0)

不,你已经在Java和线程编程中看到了“synchronized”。你是否已经熟悉另一种语言的线程编程?

答案 4 :(得分:0)

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

if语句必须在其条件块中执行代码才能使程序正确分支。我不确定条件不完全执行的想法来自哪里,但我认为你可以看到它对程序的确定性执行会有什么问题。我甚至不确定如果没有完全执行/评估条件中的代码,if语句将如何分支。

答案 5 :(得分:0)

  

据我了解有机会(特别是如果方法setX()   不仅仅设置x)elaborateX()将返回“1”。

只有在setX中生成新线程时才会发生这种情况,因此elaborateX执行线程会继续将x视为1。

  

在这种情况下,elaborateX()总会返回“6”吗?

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

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

这可以是定时等待/中断,也可以是joining线程