在Java中,如果您有以下方法:局部变量和线程安全
public int foo(int n) {
int i=n;
i = i+1; i = i-1;
return i;
}
所以在顺序程序的返回值将始终是相同的输入。
即:j == foo(j)
不过,如果你有多个线程调用foo,你能保证j==foo(j)
?
我会说是的,它是有保证的,因为i
是一个局部变量,并且每个线程都有自己的堆栈,所以i
将是每个线程不同的内存位置。
我会说你不能保证j==foo(j)
如果i
是一个实例变量:
private int i;
public int foo(int n) {
i=n;
i = i+1; i = i-1;
return i;
}
因为线程可以交错和i
值可以通过一个线程执行的方法来改变半路上,或一个线程可以递增i
,但是在它有机会递减之前,另一个线程返回,其输入增加两次并仅递减一次。
你的假设是正确的,但是我会添加一些更可怕的东西:在修改实例变量的情况下,绝对不能保证每个线程的递增和递减顺序都是这样。一个线程可能会看到一个递增,然后是一个递减,另一个看到它们按照相反的顺序发生。 – biziclop
@biziclop我能理解多incremenents或递减,但看到只有一个递减和一个递增的顺序我不明白发生? –
的规则是'在没有的两个操作之间订货前发生时,JVM可以自由地重新排序因为它pleases.'由于是在观察线程运行在修改线程运行的代码和代码之间没有这种关系,观察线程可能以任何顺序查看修改结果。 – biziclop