【问题标题】:Can we read and write to a file concurrently?我们可以同时读取和写入文件吗?
【发布时间】:2020-04-18 15:36:36
【问题描述】:

假设我有两个线程(threadAthreadB),其中 threadA 正在读取文件,而 threadB 正在写入同一个文件,这里有两种方法:

// Thread A reads
java.nio.file.Files.readAllBytes(Path.get("test.txt"));

// Thread B writes
java.nio.file.Files.write(Paths.get("test.txt"), bytes);

如果两个线程同时运行会发生什么?

如果threadA开始读取,则threadB写入文件(threadA尚未完成读取),threadA会读取原始文件(在threadB修改之前)还是修改后的文件,还是会抛出异常?

【问题讨论】:

  • 试试看;因为它取决于您的文件系统。尝试分别锁定文件进行读写,看看行为如何变化。
  • 问题在于它真的很难测试,因为读取和写入应该同时发生。
  • 启动一百个读线程(读取文件);启动五个写入线程(如果您愿意,可以在文件中附加一行或字符)。您应该很快就能看到结果。
  • @OlivierBoissé 为什么读写要同时发生?你在设计什么要求你想使用这种方法?您希望您的应用程序如何通过同时写入和保存来工作?通过这样设计您的应用程序,您会得到什么?您正在故意创建一个竞争条件,而您一开始就不想拥有它。
  • 我有一个批处理,它每天调用一次网络服务并将结果存储到一个文件中。该文件可用于向网页显示一些信息(我们称其为主页)。因此,当客户访问主页时,会读取文件,如果它发生在批处理运行的同时,我只是想知道在这种情况下会发生什么?我希望不会抛出异常,无论读取的文件是原始文件还是批量更新的文件

标签: java java-io


【解决方案1】:

这不是对“将会发生什么”问题的回答,而是...

将批处理的结果写入 result.file 并“处理”它应该由单独的处理程序处理。 看看目录监视服务Watching a Directory for Changes 新的result.file.yyy-mm-dd(e.g.)写完,或者文件修改后,应该解析,准备好网页内容。否则每次有人访问该页面时都会对其进行解析 - 我认为这不是那么优雅。 借助synchronized 之类的锁定机制,可以避免“可能”时刻。

【讨论】:

    猜你喜欢
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多