如果多個線程並行調用apache
commons io
FileUtils.contentEquals()
FileUtils.contentEquals()
靜態方法會發生什麼?多線程調用apache commons io並行FileUtils.contentEquals()靜態方法
這裏我們可以保證每個執行的最終結果沒有任何競爭條件,因爲這個方法只包含局部變量嗎?
請對此提出建議。
如果多個線程並行調用apache
commons io
FileUtils.contentEquals()
FileUtils.contentEquals()
靜態方法會發生什麼?多線程調用apache commons io並行FileUtils.contentEquals()靜態方法
這裏我們可以保證每個執行的最終結果沒有任何競爭條件,因爲這個方法只包含局部變量嗎?
請對此提出建議。
此方法調用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;
}
通過查看FileUtils.contentEquals的源代碼,它使用BufferedInputStream在兩個文件之間進行比較(通過將兩個文件的InputStream提供給IOUtils.contentEquals)。
由於BufferedInputStream應該是線程安全的(至少我讀過,我從來沒有嘗試過),我想FileUtils.contentEquals也應該是線程安全的。
這取決於你多個線程是否通過相同的參數或不同的參數。具有不同參數的多個線程應該是線程安全的,因爲爭用中沒有資源。
如果您通過多個線程傳遞相同的參數,我首先會問是否需要這樣做。但忽略它,應該沒問題,因爲該方法會創建獨立的輸入流。在這種情況下唯一可能出錯的是操作系統抱怨對同一文件的多次訪問。
實際上多個線程正在解析不同的參數。 – Asanka