提问者:小点点

仅具有局部变量的实例方法的线程安全性


通常,同时调用使用局部变量的实例方法是否只影响线程安全?

这里有一个简短的例子。多个线程将调用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) {}
        }
    }
}

共1个答案

匿名用户

当您调用一个方法时,局部变量驻留在单个调用的堆栈中,所以您不需要担心多线程情况下的局部变量,但如果将相同的File作为参数传递,则会产生问题。

阅读为什么Java中的局部变量是线程安全的

创建线程时,它将创建自己的堆栈。两个线程将有两个堆栈,一个线程从不与另一个线程共享其堆栈。

局部变量总是线程安全的。但是请记住,局部变量指向的对象可能不是这样。如果对象是在方法内部实例化的,并且从不转义,那么就不会有问题。

另一方面,指向某个共享对象的局部变量仍可能引起问题。仅仅因为您将共享对象分配给本地引用,并不意味着该对象自动成为线程安全的。

请参阅JavaRanch-线程安全和局部变量。

如果局部变量是primative变量,那么是的,它是线程安全的。如果局部变量是指向本地创建的对象的引用,那么是的,它应该是线程安全的(假设静态是线程安全的)。

如果局部变量是指向外部创建的对象的引用,那么它是线程安全的,如果且仅当该对象可以以线程方式安全使用时。

相关问题