局部变量和线程安全

时间:2015-04-28 16:16:25

标签: java multithreading

如果您有以下方法,请使用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,但在它有机会递减它之前,另一个线程返回时它的输入递增两次并且只递减一次。

1 个答案:

答案 0 :(得分:6)

  

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

完全。每次拨打foo都是独立的,因为foo并未使用任何共享状态。

  

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

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