通常,同时调用使用局部变量的实例方法是否只影响线程安全性?
这是一个简短的例子。多个线程将调用a();
。
public class A {
public boolean a(File file) throws Exception {
boolean t = true;
FileInputStream fin = null;
BufferedInputStream bin = null;
try {
fin = new FileInputStream(file);
bin = new BufferedInputStream(fin);
while(bin.read() > 0) {}
return t;
finally {
try {
if (in != null) in.close();
} catch (IOException e) {}
try {
if (fin != null) fin.close();
} catch (IOException e) {}
}
}
}
答案 0 :(得分:11)
调用方法时,局部变量驻留在单个调用的堆栈中,因此在多线程的情况下也不必担心局部变量,但如果相同,则可能会产生问题{ {1}}作为参数传递。
阅读Why are local variables thread safe in Java
创建线程时,它将创建自己的堆栈。两个线程将有两个堆栈,一个线程永远不会与其他线程共享其堆栈。
局部变量始终是线程安全的。但请记住,局部变量指向的对象可能不是这样。如果对象在方法中被实例化,并且永远不会逃脱,那么就没有问题。
另一方面,指向某个共享对象的局部变量可能仍会导致问题。仅仅因为您将共享对象分配给本地引用,并不意味着该对象自动变为线程安全。
请参阅JavaRanch - Thread safe and local variable.
如果局部变量是一个主要变量,那么是的,它是线程安全的。如果局部变量是指向本地创建的对象的引用,那么是的,它应该是线程安全的(假设静态是线程安全的)。
如果局部变量是指向外部创建的对象的引用,那么它是线程安全的,当且仅当该对象可以以线程方式安全使用时。