是否可能出现这种情况:
一个线程(T1)调用某个方法,例如compute(10);
当该函数仍在执行时,另一个线程再次调用它(带有其他参数),比如compute(20);
如果方法
public int compute(int i) {
return i+20;
}
每个线程都会得到正确的结果吗?
我希望T1获得20
,T2获得40
。
答案 0 :(得分:1)
简短的回答,是的。每个线程都获得自己的方法堆栈数据,该数据与其他线程完全分开。当线程之间的数据(例如类级变量) 共享 时,您只需要担心冲突。
答案 1 :(得分:1)
由于您只使用局部变量(方法参数是本地的),是的,这是安全的。
public class Computer {
public int compute(int i) {
return i+20;
}
}
如果你要使用实例变量或静态变量,那么你应该synchronized
每read
和write
到变量。
public class Computer {
private int increment;
public synchronized int compute(int i) {
return i+increment; // <-- reads increment
}
private synchronized void setIncrement(int increment) {
this.increment = increment; // <-- writes increment
}
}
答案 2 :(得分:0)
假设您的compute
方法实现是:
int compute(int i) {
return i + 20;
}
然后每个线程将获得正确的结果,因为此方法不使用共享状态。