¿El siguiente código Java garantiza y la cerradura exclusiva en un archivo sin abrir en Windows?

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

Pregunta

¿El siguiente código Java garantiza una cerradura exclusiva en un archivo sin abrir en 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();
        }
    }
}

¿Fue útil?

Solución

Como se puede ver en las especificaciones de Java:

Los bloqueos de archivos se mantienen en nombre de toda la máquina virtual Java.No son adecuados para controlar el acceso a un archivo por múltiples hilos dentro de la misma máquina virtual.

Entonces, si necesita una cerradura exclusiva para el hilo, elija otra forma.

Otros consejos

tl; DR: No. No puede hacer suposiciones sobre el comportamiento del tratamiento del sistema operativo del host de sus cerraduras.

Buenas noticias: ¿Está intentando asegurarse de que tenga un mecanismo de bloqueo seguro de hilo dentro de su solicitud? Si es así, FileLock es suficiente (asumiendo que el resto de la aplicación esté compuesto por un código seguro de hilo correctamente escrito, por supuesto).

Noticias malas: Desafortunadamente, si está tratando de asegurarse de que Windows honrará su bloqueo sobre todas las aplicaciones, no puede contar con eso.

Esto es fácil de observar en Windows: a menudo puede sobrescribir los archivos que se están escribiendo (cuando los archivos de registro se vuelven demasiado largos, por ejemplo, tengo Emacs Chop todo el spam anterior). Dicho esto, Windows generalmente no le permitirá eliminar un archivo abierto.

de La documentación de FileLock :

Los bloqueos de archivos se mantienen en nombre de la Toda la máquina virtual Java. Ellos son No es adecuado para controlar el acceso a un archivo por múltiples hilos dentro del La misma máquina virtual.

Los objetos de bloqueo de archivos son seguros para su uso por múltiples hilos concurrentes.

... y luego ...

Si una cerradura en realidad o no Previene otro programa de Acceso al contenido del bloqueo. La región depende del sistema y por lo tanto no especificado. El nativo Instalaciones de bloqueo de archivos de algunos Los sistemas son meramente asesoros, lo que significa que los programas deben cooperativamente Observe un protocolo de bloqueo conocido en Para garantizar la integridad de los datos. En Otros sistemas Los bloqueos de archivos nativos son Obligatorio, lo que significa que si un programa bloquea una región de un archivo entonces otra En realidad se evitan programas de Accediendo a esa región de una manera que violaría la cerradura. En otro otro sistemas, ya sean los bloqueos de archivos nativos Asesoramiento o obligatorio es configurable. por base por archivo. Para asegurar comportamiento consistente y correcto a través de Plataformas, se recomienda encarecidamente. que las cerraduras proporcionadas por esta API sean Utilizado como si fueran cerraduras de asesoría.

Incluso si usa Bloquear y desbloquear banderas para el archivo, solo está garantizando que tiene una cerradura exclusiva dentro de su solicitud de Java .

Usted tiene que usar el JNI, u otro idioma de la computadora, para realizar las llamadas de Windows para garantizar un bloqueo exclusivo en un archivo de Windows.

Windows Función de LockFile

Windows la función de desbloqueo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top