¿Es una operación de movimiento en Unix atómico?

Supongamos que hay 2 procesos P1 y P2, y acceden a un archivo compartidoFoo.txt.

Supongamos que P2 está leyendo deFoo.txt. No quiero que P1 escriba aFoo.txt mientras P2 lo está leyendo.

Así que pensé que podría hacer P1 escribir aFoo.tmp y como ultimo paso, renombrarFoo.tmp aFoo.txt. Mi lenguaje de programacion es java

Así que mi pregunta es, ¿garantizaría esto que P2 lea los datos correctos deFoo.txt? ¿Se confirmaría la operación de cambio de nombre una vez que P2 complete la lectura del archivo?

EDITAR

Intenté recrear este escenario de la siguiente manera:

Mi código P1 es algo como esto:

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

y mi código P2 es:

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

Mi archivo compartido de muestra:

Test Input
Test Input
Test Input   

Estoy empezando P1 y P2 casi simultáneamente (P2 comienza primero).

Así que, según tengo entendido, aunque P1 ha escrito un nuevo Foo.txt, ya que P2 ya lo está leyendo, debería leer el contenido anterior de Foo.txt hasta que vuelva a abrir un BufferedReader a Foo.txt.

Pero lo que realmente sucede es que P2 lee.Test Input&nbsp;tres veces, como se espera de la entrada, pero después de eso lee el nuevo contenido que fue escrito por P1.

Salida de P2:

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

Así que no funciona como debería. ¿Estoy probando este escenario mal? Siento que hay algo que me estoy perdiendo.