Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅具有局部变量的实例方法的线程安全性_Java_Multithreading - Fatal编程技术网

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

Java 仅具有局部变量的实例方法的线程安全性,java,multithreading,Java,Multithreading,通常,同时调用使用局部变量的实例方法是否只影响线程安全 这里有一个简短的例子。多个线程将调用a() 调用方法时,局部变量驻留在单个调用的堆栈中,因此在多线程情况下也不需要担心局部变量,但如果将相同的文件作为参数传递,则可能会产生问题 阅读 创建线程时,它将创建自己的堆栈。两个线程将有两个堆栈,一个线程从不与另一个线程共享其堆栈 局部变量总是线程安全的。但是请记住,局部变量指向的对象可能不是这样。如果对象是在方法内部实例化的,并且从不转义,那么就不会有问题 另一方面,指向某个共享对象的局部变量仍

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

这里有一个简短的例子。多个线程将调用
a()


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

阅读

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

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

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


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


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

所有线程都访问同一文件吗?即使是,因为它是“只读”的-我在这里没有看到任何并发问题。您是在一般情况下还是在这个特定示例中询问?一般来说,您不知道:局部变量引用是线程安全的,但是它们引用的对象可以以多种不同的方式访问共享资源,并导致并发问题。@user3218114不一定是同一个文件。只有相同的A.@ErwinBolwidt我希望找到一般的答案。user3218114在一般情况下和特定示例中都解释了这一点,这是一件好事。+1用于解决与对象引用相关的问题。好的一点。指向在线程中创建的对象且永不转义的局部变量仍然可能导致问题。当它们直接或间接引用共享资源时(通过静态字段、ThreadLocal变量或API或第三方库提供的许多其他机制之一),它们也可能导致并发问题。
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) {}
        }
    }
}