Является ли операция перемещения в Unix атомарной?

Предположим, есть 2 процесса P1 и P2, и они получают доступ к общему файлуFoo.txt.

Предположим, что P2 читает изFoo.txt, Я не хочу, чтобы P1 писалFoo.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.

Но на самом деле происходит чтение P2Test Input трижды, как ожидается от ввода, но после этого он читает новый контент, который был написан P1.

Выход из P2:

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

Так что это не работает так, как должно. Я тестирую этот сценарий неправильно? Я чувствую, что что-то упускаю.

Ответы на вопрос(3)

Ваш ответ на вопрос