【发布时间】:2020-04-18 15:36:36
【问题描述】:
假设我有两个线程(threadA 和 threadB),其中 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é 为什么读写要同时发生?你在设计什么要求你想使用这种方法?您希望您的应用程序如何通过同时写入和保存来工作?通过这样设计您的应用程序,您会得到什么?您正在故意创建一个竞争条件,而您一开始就不想拥有它。
-
我有一个批处理,它每天调用一次网络服务并将结果存储到一个文件中。该文件可用于向网页显示一些信息(我们称其为主页)。因此,当客户访问主页时,会读取文件,如果它发生在批处理运行的同时,我只是想知道在这种情况下会发生什么?我希望不会抛出异常,无论读取的文件是原始文件还是批量更新的文件