我对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%确定,否则我将使用“正确的方法”而不是这个“技巧”。
由于
答案 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
线程