局部变量和线程安全

Jon*_*an. 9 java multithreading

在Java中,如果您有以下方法:

public int foo(int n) {
    int i=n;
    i = i+1; i = i-1;
    return i;
}
Run Code Online (Sandbox Code Playgroud)

因此,在顺序程序中,返回值将始终与输入相同.

即: j == foo(j)

但是如果你有多个线程调用foo,你能保证j==foo(j)吗?

我会说是肯定的,因为它i是一个局部变量,每个线程都有自己的堆栈,因此i每个线程的内存位置都不同.

我会说你无法保证j==foo(j)if i是一个实例变量:

private int i;
public int foo(int n) {
    i=n;
    i = i+1; i = i-1;
    return i;
}
Run Code Online (Sandbox Code Playgroud)

因为线程可以交错和值i可通过线程执行的方法来改变半路上,或者一个线程可以增加i,但它得到的几率减小它之前,它的另一个线程返回的投入增加两倍,并减少一次.

Jon*_*eet 6

我会说是的,它是有保证的,因为我是一个局部变量,每个线程都有自己的堆栈,所以我将成为每个线程的不同内存位置.

究竟.每次调用foo都是独立的,因为foo没有使用任何共享状态.

我会说如果我是一个实例变量,你不能保证j == foo(j)

再次纠正.听起来你基本上得到了正确的想法.(请注意,即使"递增"和"递减"也不是原子操作,因此如果您有多个线程执行这些操作,则最终会陷入棘手的情况.这就是AtomicInteger存在的原因.)