Подходит ли следующая гарантия кода Java и эксклюзивный замок на неоткрытом файле в Windows?

StackOverflow https://stackoverflow.com/questions/3203073

Вопрос

делает следующий код Java, гарантирует эксклюзивный замок на неоткрытый файл в Windows?

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {
    public static void main(String[] args) {
        File file = new File("mylog.log");
        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.getChannel().lock();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
.

Это было полезно?

Решение

Как можно увидеть в Java Specs:

Файловые замки удерживаются от имени всей виртуальной машины Java.Они не подходят для управления доступом к файлу несколькими потоками на одной виртуальной машине.

Так что, если вам нужен эксклюзивный замок для резьбы, пожалуйста, выберите другой путь.

Другие советы

TL; DR: Нет. Вы не можете сделать предположения о поведении обработки операционной системы хоста ваших замков.

Хорошие новости: Вы пытаетесь убедиться, что у вас есть механизм блокировки в потоке в вашем приложении? Если это так, FileLock достаточно (предполагая, что остальная часть приложения состоит из правильно написанного потоковым кодом, конечно).

Плохие новости: К сожалению, если вы пытаетесь убедиться, что Windows уступит ваш замок по всем приложениям, вы не можете рассчитывать на это.

Это легко наблюдать в Windows: вы часто можете перезаписать файлы, которые записываются (когда файлы журнала становятся слишком длинными, у меня есть Emacs, например, все предыдущие спам). Тем не менее, Windows обычно не позволит вам удалить открытый файл.

Документация FileLock :

файловые замки проводятся от имени Вся виртуальная машина Java. Они есть не подходит для контроля доступа к файл несколькими потоками в пределах Та же виртуальная машина.

Объекты блокировки файлов безопасны для использования несколько одновременных потоков.

... а позже ...

или нет ли замок на самом деле предотвращает другую программу от Доступ к содержанию заблокированного регион зависит от системной системы и поэтому не указано. Родной Устройства блокировки файлов некоторых системы просто консультационные, значения что программы должны сотрудничать Соблюдайте известный протокол блокировки в Чтобы гарантировать целостность данных. На Другие системы нативных блокировков файлов Обязательно, что означает, что если одна программа блокирует область файла, а затем другой Программы фактически предотвращаются от доступ к этой области таким образом, чтобы нарушит замок. На еще другом Системы, являются ли нативные блокировки файлов Консультативный или обязательный настраиваемый на за материалом. Для обеспечения последовательное и правильное поведение по всему платформы, это настоятельно рекомендуется что замки, предоставленные этой API, будут Используется как если бы они были консультативными замками.

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

Вы либо должны использовать JNI, либо другой компьютерный язык, чтобы сделать вызовы Windows, чтобы гарантировать эксклюзивный замок в файле Windows.

Windows Функция Lockfile

Windows unlockfile Функция

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top