Garantiert der folgende Java-Code eine exklusive Sperre für eine ungeöffnete Datei in Windows?

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

Frage

Garantiert der folgende Java-Code eine exklusive Sperre für eine ungeöffnete Datei in 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();
        }
    }
}
War es hilfreich?

Lösung

Wie in Java-Spezifikationen gesehen werden können:

Dateisperren werden im Auftrag der gesamten virtuellen Java-Maschine gehalten.Sie sind nicht geeignet, um den Zugriff auf eine Datei mit mehreren Threads innerhalb derselben virtuellen Maschine zu steuern.

Wenn Sie also exklusive Sperre für den Thread benötigen, wählen Sie bitte einen anderen Weg.

Andere Tipps

tl;dr: NEIN.Sie können keine Annahmen über das Verhalten des Host-Betriebssystems bei der Behandlung Ihrer Sperren treffen.

Gute Nachrichten: Versuchen Sie sicherzustellen, dass Ihre Anwendung über einen threadsicheren Sperrmechanismus verfügt?Wenn ja, FileLock ist ausreichend (vorausgesetzt natürlich, dass der Rest der Anwendung aus ordnungsgemäß geschriebenem Thread-sicherem Code besteht).

Schlechte Nachrichten: Wenn Sie sicherstellen möchten, dass Windows Ihre Sperre für alle Anwendungen berücksichtigt, können Sie sich leider nicht darauf verlassen.

Dies ist unter Windows leicht zu beobachten:Sie können häufig Dateien überschreiben, in die geschrieben wird (wenn Protokolldateien zu lang werden, lasse ich Emacs zum Beispiel alle vorherigen Spam-Nachrichten entfernen).Allerdings lässt Windows das Löschen einer geöffneten Datei normalerweise nicht zu.

Aus der FileLock-Dokumentation:

Dateischlösser werden im Namen der gesamten Java -Virtual Machine gehalten.Sie sind nicht geeignet, um den Zugriff auf eine Datei durch mehrere Threads in derselben virtuellen Maschine zu steuern.

Datei-Lock-Objekte sind sicher für mehrere gleichzeitige Threads.

...und später ...

Ob ein Schloss tatsächlich verhindert, dass ein anderes Programm auf den Inhalt der gesperrten Region zugreift, ist systemabhängig und daher nicht spezifiziert.Die nativen Datei-Sperreneinrichtungen einiger Systeme sind lediglich beratend, was bedeutet, dass Programme ein bekanntes Sperrenprotokoll kooperativ beobachten müssen, um die Datenintegrität zu gewährleisten.Bei anderen Systemen native Dateisperrs sind obligatorisch.Bei anderen Systemen kann native Dateisperrungen beratend oder obligatorisch konfigurierbar sind.Um ein konsistentes und korrektes Verhalten zwischen Plattformen zu gewährleisten, wird dringend empfohlen, die von dieser API bereitgestellten Schlösser zu verwenden, als wären sie Beratungsschlösser.

Auch wenn Sie Sperre sperren und Flags für die Datei verwenden, garantieren Sie nur, dass Sie eine exklusive Sperre in Ihrer Java-Anwendung haben .

Sie müssen entweder die JNI oder eine andere Computersprache verwenden, um die Windows-Anrufe aufrufen, um eine exklusive Sperre in einer Windows-Datei zu gewährleisten.

windows lockfile Funktion

Windows freischalten Funktion

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top