É uma operação de movimento no Unix atômica?

Suponha que existem 2 processos P1 e P2, e eles acessam um arquivo compartilhadoFoo.txt.

Suponha que P2 esteja lendo deFoo.txt. Eu não quero que o P1 escreva paraFoo.txt enquanto P2 está lendo.

Então eu pensei em fazer o P1 escrever paraFoo.tmp e como último passo, renomeieFoo.tmp paraFoo.txt. Minha linguagem de programação é Java

Então, minha pergunta é, isso garantiria que P2 lesse os dados corretos deFoo.txt? A operação de renomeação seria confirmada quando P2 concluísse a leitura do arquivo?

EDITAR

Eu tentei recriar esse cenário da seguinte maneira:

Meu código P1 é algo assim:

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);

e meu código 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();
}

Meu arquivo compartilhado de amostra:

Test Input
Test Input
Test Input   

Estou começando P1 e P2 quase simultaneamente (P2 começando primeiro).

Então, de acordo com o meu entendimento, apesar de P1 ter escrito um novo Foo.txt, já que o P2 já está lendo, ele deve ler o conteúdo antigo do Foo.txt até que ele reabra um BufferedReader para Foo.txt.

Mas o que realmente acontece é P2 lêTest Input três vezes, como é esperado a partir da entrada, mas depois que lê o novo conteúdo que foi escrito por P1.

Saída de P2:

Test Input
Test Input
Test Input 
Hello World
Hello World
Hello World
 .
 .
 .

Então não funciona como deveria. Estou testando esse cenário errado? Eu sinto que há algo que estou perdendo.

questionAnswers(3)

yourAnswerToTheQuestion