Обработка блокировки файлов, когда приложение неожиданно завершает работу - PullRequest
0 голосов
/ 02 ноября 2011

Я исследую лучший (кроссплатформенный) способ блокировки некоторых файлов, используемых приложением Java.

Наихудший сценарий - неожиданное завершение программы (пользователь принудительно завершает работу или нечисто завершает работу). В этом случае, каков наилучший способ обеспечить снятие блокировок файлов, чтобы они не влияли на последующий доступ программы?

Я смотрел на использование FileLock, но нечистое завершение могло оставить файл в заблокированном непригодном для использования состоянии.

Есть ли способ решить эту проблему с помощью кода? или обнаружение таких проблем для первой «очистки», или при последующем запуске программы?

Ответы [ 3 ]

4 голосов
/ 02 ноября 2011

Я не думаю, что у FileLock есть проблема, о которой вы думаете.В соответствии с документацией он использует функциональность блокировки файлов ОС, которая, я думаю, означает, что большинство ОС будет очищать любые блокировки, удерживаемые процессом, когда он завершает работу (хотя вы можете захотеть сделать несколько тестов для проверки этого).

В противном случаевам нужен способ определить, устарела ли блокировка или нет.

Распространенный метод для обработки этого с помощью таких вещей, как сценарии оболочки, - поместить идентификатор процесса (PID) в файл блокировки.Таким образом, другие приложения, которые видят файл блокировки, могут проверить, действительна ли блокировка, проверяя, запущен ли этот процесс.Если процесс не запущен, замок можно очистить.

Хотя я не знаю, как сделать это через Java ...

2 голосов
/ 02 ноября 2011

В худшем случае программа неожиданно завершает работу

В этом случае ваша программа сама не может нести ответственность за освобождение блокировок, поскольку она перестает выполняться. Поэтому вы должны полагаться на что-то вне программы. Но эта вещь сама по себе не может быть программой, потому что она тоже может неожиданно завершить работу. Поэтому вы должны полагаться на саму операционную систему. Конечно, нет кроссплатформенного способа сделать это.

1 голос
/ 02 ноября 2011

Вы можете зарегистрировать отключающий хук для освобождения любых FileLock с после завершения приложения.Очевидно, этот код не будет работать, если JVM неожиданно умирает из-за сброса ПК, ошибки Hotspot и т. Д.

File lockFile = new File("c:/tmp/lock");
final FileLock lock = lockFile.channel().lock();

Runtime.getRuntime().addShutDownHook(new Thread(new Runnable() {
  public void run() {
    lock.release();
  }
}));
...