Что произойдет, если две разные программы попытаются выполнить запись в один и тот же файл одновременно?

#file-locking

#блокировка файла

Вопрос:

  1. Что произойдет, если две разные программы попытаются выполнить запись в один и тот же файл одновременно?

  2. Возникнет ли у одной из программ ошибка блокировки файла?

  3. Как должны быть спроектированы программы для обработки этого сценария?

Комментарии:

1. Это зависит от операционной системы. Какая из них вас беспокоит?

2. @philippe: Меня беспокоит только операционная система на базе Microsoft Windows.

Ответ №1:

Когда второе приложение (или поток) попытается открыть файл для записи, это вызовет исключение ввода-вывода.. просто..

Комментарии:

1. Сначала вы можете поместить код открытия файла в блок try catch .. если это успешно, то вы пишете .. если нет, вы запрашиваете пользователя или повторяете попытку через определенный интервал.. Или вы можете попробовать использовать «БАЗУ ДАННЫХ», где несколько приложений могут изменять ее одновременно..

Ответ №2:

допустим, у вас есть пользователь A и пользователь B, что вы можете сделать, это позволить им обоим изменять содержимое, будет небольшая разница во времени, какой бы «одновременной» вы этого ни хотели, поэтому проверьте, какой пользователь «отправил» изменения первым, сохраните эти изменения и отправьте следующему пользователю интеллектуальное сообщение со словами «файл был обновлен, проверьте изменения перед … бла-бла-бла».

Ответ №3:

Используйте FileLock, чтобы избежать исключения ввода-вывода, когда к файлу обращаются несколько потоков.

Комментарии:

1. Можете ли вы пояснить? Что такое «Блокировка файла»?

2. пожалуйста, перейдите по ссылке ниже download.oracle.com/javase/1.4.2/docs/api/java/nio/channels /…

3. вы только что упомянули тег как «Блокировка файла», вам следовало бы также упомянуть его как «.net». Ответ то, что я ответил, применимо ко всем языкам, где применима концепция syncronised, и в комментарии, который я упомянул в качестве примера. Поэтому, пожалуйста, измените репутацию с -1 на 0 .

4. @user668970: я не менял репутацию