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

时间:2014-11-13 10:23:03

标签: java multithreading delete-file

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

2 个答案:

答案 0 :(得分:1)

<强> 一个。什么原子操作对多线程任务意味着什么?

在多线程的情况下,原子性是线程以这种方式执行任务的能力,以便其他线程在该线程执行时对该任务的状态变量显然没有副作用。

File.createNewFile(): - 对于此方法,当线程即将执行此方法时,状态是存在还是不存在。让我们说当线程执行此方法时文件不存在。现在假设这个方法需要5毫秒的时间来执行和创建文件。因此,根据Atomicity的概念,在这5ms期间没有其他线程应该能够创建相同的文件(以前不存在),否则关于文件状态的该线程的第一个假设将改变,因此输出。 / p>

因此,在这种情况下,执行线程会通过在要创建文件的目录上获取写锁来实现此目的。

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

  

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

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

确定文件是否是符号链接请参阅参考: - determine symlink

<强> 湾我应该以某种方式在我的Java应用程序中同步这些块以及如何?

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

答案 1 :(得分:0)

您的意思是File.createNewFile()吗?

Javadoc说: The check for the existence of the file and the creation of the file if it does not exist are a single operation that is atomic with respect to all other filesystem activities that might affect the file.

换句话说,在检查文件是否存在与创建文件之间是否存在其他文件操作,改变文件的存在。

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

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