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

Tam*_*ang 2 java multithreading

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

这是一个简短的例子.多个线程将调用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) {}
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*raj 11

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

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

创建线程时,它将创建自己的堆栈.两个线程将有两个堆栈,一个线程永远不会与其他线程共享其堆栈.

在此输入图像描述

局部变量始终是线程安全的.但请记住,局部变量指向的对象可能不是这样.如果对象在方法中被实例化,并且永远不会逃脱,那么就没有问题.

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


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

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

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

  • +1用于解决与对象引用相关的问题.好点子. (2认同)
  • 指向在线程中创建且永不转义的对象的局部变量仍然可能导致问题.当它们直接或间接引用共享资源时(通过静态字段,通过ThreadLocal变量,或API或第三方库提供的许​​多其他机制之一),它们也可能导致并发问题. (2认同)