Гарантирует ли следующий код Java и эксклюзивную блокировку неоткрытого файла в Windows? - PullRequest
0 голосов
/ 08 июля 2010

Гарантирует ли следующий код 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();
        }
    }
}

Ответы [ 3 ]

1 голос
/ 08 июля 2010

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

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

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

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

Из документации FileLock :

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

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

... и позже ...

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

1 голос
/ 08 июля 2010

Как видно из спецификаций Java:

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

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

0 голосов
/ 08 июля 2010

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

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

Windows LockFile функция

Windows UnlockFile функция

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...