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,但它得到的几率减小它之前,它的另一个线程返回的投入增加两倍,并减少一次.
我会说是的,它是有保证的,因为我是一个局部变量,每个线程都有自己的堆栈,所以我将成为每个线程的不同内存位置.
究竟.每次调用foo都是独立的,因为foo没有使用任何共享状态.
我会说如果我是一个实例变量,你不能保证j == foo(j)
再次纠正.听起来你基本上得到了正确的想法.(请注意,即使"递增"和"递减"也不是原子操作,因此如果您有多个线程执行这些操作,则最终会陷入棘手的情况.这就是AtomicInteger存在的原因.)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |