假设有 2 个进程 P1 和 P2,它们访问一个共享文件Foo.txt
。
假设 P2 正在读取Foo.txt
. 我不希望 P1Foo.txt
在 P2 读取时写入。
所以我想我可以让 P1 写入Foo.tmp
并作为最后一步,重命名Foo.tmp
为Foo.txt
. 我的编程语言是Java
所以我的问题是,这会确保 P2 从 读取正确的数据Foo.txt
吗?一旦 P2 完成读取文件,是否会提交重命名操作?
编辑
我试图重新创建这个场景,如下所示:
我的 P1 代码是这样的:
File tempFile = new File(path1);
File realFile = new File(path2);
BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
for(int i=0;i<10000;i++)
writer.write("Hello World\n");
writer.flush();
writer.close();
tempFile.renameTo(realFile);
我的 P2 代码是:
BufferedReader br = new BufferedReader(new FileReader(file));
String line = null;
while(true) {
while((line=br.readLine())!=null){
System.out.println(line);
Thread.sleep(1000);
}
br.close();
}
我的示例共享文件:
Test Input
Test Input
Test Input
我几乎同时启动 P1 和 P2(P2 先启动)。
所以根据我的理解,即使P1已经写了一个新的Foo.txt,由于P2已经在读取它,它应该读取旧的Foo.txt内容,直到它重新打开一个BufferedReader到Foo.txt。
但实际发生的是 P2 读取Test Input
三次,正如输入所预期的那样,但之后它读取 P1 写入的新内容。
P2的输出:
Test Input
Test Input
Test Input
Hello World
Hello World
Hello World
.
.
.
所以它不能正常工作。我测试这个场景错了吗?我觉得我错过了什么。