如果您有以下方法,请使用Java:
public int foo(int n) {
int i=n;
i = i+1; i = i-1;
return i;
}
因此,在顺序程序中,返回值将始终与输入相同。
ie: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
,但在它有机会递减它之前,另一个线程返回时它的输入递增两次并且只递减一次。
答案 0 :(得分:6)
我会说是的,它是有保证的,因为我是一个局部变量,每个线程都有自己的堆栈,所以我将成为每个线程的不同内存位置。
完全。每次拨打foo
都是独立的,因为foo
并未使用任何共享状态。
如果i是实例变量,我会说你不能保证j == foo(j)
再次纠正。听起来你已经基本上得到了正确的想法。 (请注意,即使"递增"以及"递减"不是原子操作,因此如果您有多个线程执行这些操作,您最终会遇到棘手的情况。这就是AtomicInteger
存在的原因。)