La seguente garanzia del codice Java e il blocco esclusivo su un file non aperto in Windows?

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

Domanda

Il seguente codice Java garantisce un blocco esclusivo su un file non aperto 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();
        }
    }
}
.

È stato utile?

Soluzione

Come può essere visto nelle specifiche Java:

.

I blocchi di file sono tenuti per conto dell'intera macchina virtuale Java.Non sono adatti per il controllo dell'accesso a un file con più fili all'interno della stessa macchina virtuale.

Quindi se hai bisogno di blocco esclusivo per il thread, scegli un altro modo.

Altri suggerimenti

TL; DR: No. Non è possibile effettuare ipotesi sul comportamento del trattamento del sistema operativo host delle serrature.

Buone notizie: Stai cercando di assicurarti di avere un meccanismo di blocco sicuro di thread all'interno della tua applicazione? In tal caso, FileLock è sufficiente (supponendo che il resto dell'applicazione sia composto da un codice sicuro con filettatura correttamente scritto, ovviamente).

Bad News: Sfortunatamente, se stai cercando di garantire che Windows torerà il tuo blocco su tutte le applicazioni, non puoi contare su questo.

È facile da osservare in Windows: puoi spesso sovrascrivere i file che vengono scritti in (quando i file di registro diventano troppo lunghi, ho emacs tritare tutto lo spam precedente, ad esempio). Detto questo, Windows di solito non ti consente di eliminare un file aperto.

da La documentazione FileLock :

.

I blocchi di file sono tenuti per conto del Tutta la macchina virtuale Java. Sono non adatto per il controllo dell'accesso a Un file con più thread all'interno del stessa macchina virtuale.

Gli oggetti di blocco file sono sicuri per l'uso Discussioni concorrenti multiple.

... e dopo ...

.

Se o meno una serratura in realtà impedisce un altro programma da Accesso al contenuto del bloccato la regione è dipendente dal sistema e quindi non specificato. Il nativo Impianti di blocco dei file di alcuni I sistemi sono semplicemente consulenti, significato che i programmi devono collaborare Osservare un protocollo di blocco noto in per garantire l'integrità dei dati. Sopra Altri sistemi I blocchi di file nativi sono obbligatorio, il che significa che se un programma Blocca una regione di un file quindi altro I programmi sono effettivamente impediti accedere a quella regione in un modo che violare la serratura. Ancora altro Sistemi, se i blocchi di file nativi sono consultivo o obbligatorio è configurabile su base per file. Per garantire comportamento coerente e corretto attraverso Piattaforme, è fortemente raccomandata che le serrature fornite da questa API siano usato come se fossero serrature consultive.

Anche se si utilizza Blocco e sblocco flag per il file, si garantisce solo di avere un blocco esclusivo all'interno dell'applicazione Java .

Devi utilizzare JNI o un'altra lingua del computer, per rendere le chiamate Windows per garantire un blocco esclusivo su un file di Windows.

Windows Lockfile funzione

Windows Unlockfile funzione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top