多个线程并行调用apache common和FileUtils.contentEquals()静态方法

时间:2014-07-23 07:50:21

标签: java multithreading

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

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

请就此提出建议。

3 个答案:

答案 0 :(得分:0)

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

由于BufferedInputStream应该是线程安全的(至少我读过它,我自己从不尝试过),我认为FileUtils.contentEquals也应该是线程安全的。

答案 1 :(得分:0)

这个方法调用IOUtils.contentEquals,我认为,在多线程环境中没有任何东西可以制造竞争条件。

FileUtils.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);
    }
}

IOUtils.contentEquals()

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;
}

答案 2 :(得分:0)

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

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