Java中线程安全的文件创建和删除

Java中线程安全的文件创建和删除,java,multithreading,delete-file,Java,Multithreading,Delete File,方法Files.createFile()和Files.delete()是否线程安全?我在文档中读到,createFile()始终是一个原子操作,而delete()则不是。我是否应该在Java应用程序中以某种方式同步这些块,以及如何同步?原子操作对于多线程任务意味着什么?您的意思是File.createNewFile() Javadoc说: 检查文件是否存在以及如果文件不存在则创建该文件是一个单一操作,对于可能影响该文件的所有其他文件系统活动而言,该操作是原子操作。 换言之,在检查文件是否存在和创

方法Files.createFile()和Files.delete()是否线程安全?我在文档中读到,createFile()始终是一个原子操作,而delete()则不是。我是否应该在Java应用程序中以某种方式同步这些块,以及如何同步?原子操作对于多线程任务意味着什么?

您的意思是
File.createNewFile()

Javadoc说:
检查文件是否存在以及如果文件不存在则创建该文件是一个单一操作,对于可能影响该文件的所有其他文件系统活动而言,该操作是原子操作。

换言之,在检查文件是否存在和创建文件之间将不会有其他文件操作,从而更改文件的存在

如果两个线程想要创建同一个不存在的文件,则只有一个线程将创建该文件并返回true。另一个线程将返回false

通常,您不需要同步这些操作,但需要进行适当的异常处理。可能其他程序也会对您的文件进行操作。

a。原子操作对多线程任务意味着什么?

在多线程环境中,原子性是指线程以这种方式执行任务的能力,以便其他线程在该线程执行该任务时对该任务的状态变量没有明显的副作用

File.createNewFile():-对于此方法,当线程即将执行此方法时,状态为文件存在或不存在。假设线程执行此方法时,该文件不存在。现在让我们假设这个方法需要5毫秒的时间来执行和创建文件。因此,根据原子性的概念,任何其他线程都不应该在这5毫秒内创建相同的文件(以前不存在),否则该线程关于文件状态的第一个假设将发生变化,因此输出也将发生变化

因此,在本例中,执行线程通过在要创建文件的目录上获得写锁来实现这一点

Files.delete():-此方法的Java文档显示

此方法可能不是原子的 其他文件系统操作。如果文件是符号链接,则 符号链接本身(而不是链接的最终目标)将被删除

上面的语句表示此操作也是原子的,但如果在符号链接上调用此方法,则会删除链接而不是文件。这意味着原始文件存在,并且其他线程可以对该文件执行文件系统操作

要确定文件是否为符号链接,请参阅参考:-

b。我是否应该以某种方式在Java应用程序中同步这些块,以及如何同步?

在这两种情况下,您不需要处理任何多线程场景。 但是,您可以使用上面链接中提到的方法来确定符号链接,并根据需要单独处理。
但您的终端肯定不需要同步。

您在哪里读过这篇文章?Java语言规范?一些随机的博客?这会有所不同。“通过在目录上获取写锁”是不正确的。它是在操作系统内部自动发生的,您不知道操作系统是如何实现文件创建的。”上述声明“清楚地表明,该操作可能不是原子的,也不是原子的”。