Java 原子移动和同时运行它的多个进程

Java 原子移动和同时运行它的多个进程,java,nio,Java,Nio,在我的应用程序中,我安排了一项任务,用于监视目录中具有特定扩展名的文件。这些文件将得到进一步处理。可能有多个进程正在执行此应用程序,为了防止多个实例处理同一个文件,我使用Files.move和ATOMIC\u move选项更改其扩展名,使其下次不再列出。不过,有可能不止一个应用程序实例同时尝试执行此方法-我的问题是:然后会发生什么?我应该期望抛出一些异常吗 您应该能够指望一个正确的行为:第一个“赢”,第二个获得java.nio.file.NoSuchFileException,因此您捕获该特定异

在我的应用程序中,我安排了一项任务,用于监视目录中具有特定扩展名的文件。这些文件将得到进一步处理。可能有多个进程正在执行此应用程序,为了防止多个实例处理同一个文件,我使用
Files.move
ATOMIC\u move
选项更改其扩展名,使其下次不再列出。不过,有可能不止一个应用程序实例同时尝试执行此方法-我的问题是:然后会发生什么?我应该期望抛出一些异常吗

您应该能够指望一个正确的行为:第一个“赢”,第二个获得
java.nio.file.NoSuchFileException
,因此您捕获该特定异常并忽略该文件

try {
    Files.move(previousPath, renamedPath, StandardCopyOption.ATOMIC_MOVE);
}
catch (NoSuchFileException e) {
    /* Another process has already processed that file. Ignore and move on. */
}
catch (IOException e) {
    /* Must handle that one: something else has failed */
}

我已经在Linux和macOS上用一个程序进行了验证,该程序列出了一个包含一些文件的目录,并使用随机UUID对它们进行了重命名,并在同一目录上运行了该程序的多个实例一段时间。我得到了许多
无此文件异常
,但没有其他异常


在本地文件系统上,我对此很有信心。但是,如果您在网络文件系统(NFS…)上使用它,所有赌注都已取消。

NoSuchFileException
将表明此文件在另一个进程调用
Files\move
之前已被移动-但如果该方法同时被两个进程调用会怎么样?Mu的理解是,该方法保证您将获得
NoSuchFileException
all同样:无论底层平台是什么,它都会尝试以原子方式移动文件,在您描述的情况下,文件根本不存在:在unix平台的情况下,它会产生一个错误,在java层中转换为
NoSuchFileException
,有关底层平台特定错误转换为IOException的位置,请参阅源代码。如果移动是原子的,则第二个调用将获得
enoint
,该调用将转换为
NoSuchFileException
。重要的精度(在回答中添加了一点):我假设本地文件系统。。。使用NFS会变得非常复杂:-/您的假设很好-它将在本地文件系统上使用,但您在这里提出的观点是正确的。