是否有可能有这种行为:
一个线程 (T1) 调用某个方法,例如,compute(10);
当该函数仍在执行时,另一个线程再次调用它(使用其他参数),例如,compute(20);
如果方法
public int compute(int i) {
return i+20;
}
每个线程都会得到正确的结果吗?
我希望 T1 得到20
,T2 得到40
。
是否有可能有这种行为:
一个线程 (T1) 调用某个方法,例如,compute(10);
当该函数仍在执行时,另一个线程再次调用它(使用其他参数),例如,compute(20);
如果方法
public int compute(int i) {
return i+20;
}
每个线程都会得到正确的结果吗?
我希望 T1 得到20
,T2 得到40
。
简短的回答,是的。每个线程都有自己的方法中使用的数据堆栈,该堆栈与其他线程完全分开。当线程之间共享数据(例如类级别变量)时,您只需要担心冲突。
由于您仅使用局部变量(方法参数是局部的),是的,它是安全的。
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
}
}
假设您的compute
方法实现是:
int compute(int i) {
return i + 20;
}
然后每个线程都会得到正确的结果,因为这个方法不使用共享状态。