我正在创建文件和文件夹树。我正在重写多线程。我看到的唯一弱点是在创建文件夹时。现在,它一步一步地(深入)。在写下文件之前,我检查路径是否存在。如果没有,我将使用mkdirs创建所有丢失的东西。
public void checkDir(String relativePath) {
File file = new File(homePath + relativePath);
if (!file.exists()) {
if (file.mkdirs()) {
log.info("Directory: " + homePath + relativePath + " is created!");
} else {
log.error("Failed to create directory: " + homePath + relativePath + " !");
}
}
}
我有一个问题,当我使用两个线程时会发生什么。一个具有路径A/B/C,另一个具有路径A/B/D。假设我只有一个文件夹,但没有B。因此,他们两个都将检查该路径不存在并想要创建它。因此,其中一个可能会失败,因为另一个会更快。那么我该如何管理呢?
也许我想得太多,但是从理论上讲,这种情况可能会发生。当前,我使用常规Thread,但是我想为此使用spring TaskExecutor。它自己处理关键部分,但这不是共享变量或其他任何东西,并且路径不同,因此我认为它不会识别它。
感谢您的建议。
最佳答案
指定了File.mkdirs()
方法来创建目录及其所有父目录(如果不存在)。因此,调用exists().
毫无意义,无论如何都会检查存在性。调用exists()
只是浪费时间。 mkdirs()
本质上是一个原子操作:试图超越它实际上没有任何意义。
请注意,false
的返回值不一定是失败的。它可能只是表明路径中的所有目录已经存在。
基本上,您的问题的前提是错误的。