Java 多线程并行调用apache commons io FileUtils.contentEquals()静态方法

Java 多线程并行调用apache commons io FileUtils.contentEquals()静态方法,java,multithreading,Java,Multithreading,如果多个线程并行调用apache commons io FileUtils.contentEquals静态方法,会发生什么情况 这里我们可以保证每次执行的最终结果没有任何竞争条件,因为这个方法只包含局部变量吗 请对此提出建议 通过查看FileUtils.contentEquals的源代码,它使用BufferedInputStream将两个文件的InputStream提供给IOUtils.contentEquals,从而对两个文件进行比较 由于BufferedInputStream应该是线程安全的

如果多个线程并行调用apache commons io FileUtils.contentEquals静态方法,会发生什么情况

这里我们可以保证每次执行的最终结果没有任何竞争条件,因为这个方法只包含局部变量吗


请对此提出建议

通过查看FileUtils.contentEquals的源代码,它使用BufferedInputStream将两个文件的InputStream提供给IOUtils.contentEquals,从而对两个文件进行比较


由于BufferedInputStream应该是线程安全的,这至少是我读到的,我自己从来没有尝试过,我认为FileUtils.contentEquals也应该是线程安全的。

这个方法调用IOUtils.contentEquals,我认为,在多线程环境中,没有什么可以设置争用条件

FileUtils.contentEquals

IOUtils.contentEquals


这取决于多个线程是传递相同的参数还是传递不同的参数。具有不同参数的多个线程应该是线程安全的,因为竞争中没有资源

如果您通过多个线程传递相同的参数,我首先会质疑是否需要这样做。但是忽略这一点,应该没问题,因为该方法创建独立的输入流。在这种情况下,唯一可能出错的是操作系统抱怨对同一文件的多次访问

public static boolean contentEquals(File file1, File file2) throws IOException {
    boolean file1Exists = file1.exists();
    if (file1Exists != file2.exists()) {
        return false;
    }

    if (!file1Exists) {
        // two not existing files are equal
        return true;
    }

    if (file1.isDirectory() || file2.isDirectory()) {
        // don't want to compare directory contents
        throw new IOException("Can't compare directories, only files");
    }

    if (file1.length() != file2.length()) {
        // lengths differ, cannot be equal
        return false;
    }

    if (file1.getCanonicalFile().equals(file2.getCanonicalFile())) {
        // same file
        return true;
    }

    InputStream input1 = null;
    InputStream input2 = null;
    try {
        input1 = new FileInputStream(file1);
        input2 = new FileInputStream(file2);
        return IOUtils.contentEquals(input1, input2);

    } finally {
        IOUtils.closeQuietly(input1);
        IOUtils.closeQuietly(input2);
    }
}
public static boolean contentEquals(InputStream input1, InputStream input2)
        throws IOException {
    if (!(input1 instanceof BufferedInputStream)) {
        input1 = new BufferedInputStream(input1);
    }
    if (!(input2 instanceof BufferedInputStream)) {
        input2 = new BufferedInputStream(input2);
    }

    int ch = input1.read();
    while (EOF != ch) {
        int ch2 = input2.read();
        if (ch != ch2) {
            return false;
        }
        ch = input1.read();
    }

    int ch2 = input2.read();
    return ch2 == EOF;
}