O seguinte código java garante e bloqueio exclusivo em um arquivo não aberto no Windows?

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

Pergunta

O código Java a seguir garante um bloqueio exclusivo em um arquivo não aberto no 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();
        }
    }
}
Foi útil?

Solução

Como pode ser visto nas especificações Java:

Os bloqueios de arquivos são mantidos em nome de toda a Java Virtual Machine.Eles não são adequados para controlar o acesso a um arquivo por vários threads na mesma máquina virtual.

Portanto, se você precisar de bloqueio exclusivo para o tópico, escolha outra forma.

Outras dicas

dr: Não.Você não pode fazer suposições sobre o comportamento do tratamento de seus bloqueios pelo sistema operacional host.

Boas notícias: Você está tentando garantir que possui um mecanismo de bloqueio seguro para threads em seu aplicativo?Se for assim, FileLock é suficiente (assumindo que o restante do aplicativo seja composto de código thread-safe escrito corretamente, é claro).

Más notícias: Infelizmente, se você está tentando garantir que o Windows honre seu bloqueio em todos os aplicativos, você não pode contar com isso.

Isso é fácil de observar no Windows:muitas vezes você pode sobrescrever os arquivos que estão sendo gravados (quando os arquivos de log ficam muito longos, o emacs corta todo o spam anterior, por exemplo).Dito isto, o Windows geralmente não permite excluir um arquivo aberto.

Da documentação do FileLock:

Os bloqueios de arquivo são mantidos em nome de toda a máquina virtual Java.Eles não são adequados para controlar o acesso a um arquivo por vários threads na mesma máquina virtual.

Os objetos de bloqueio de arquivo são seguros para uso por vários threads simultâneos.

...e depois ...

Se um bloqueio realmente impede que outro programa acesse o conteúdo da região bloqueada depende do sistema e, portanto, não especificada.As instalações nativas de bloqueio de arquivos de alguns sistemas são meramente consultivas, o que significa que os programas devem observar cooperativamente um protocolo de travamento conhecido para garantir a integridade dos dados.Em outros sistemas, os bloqueios de arquivos nativos são obrigatórios, o que significa que, se um programa bloquear uma região de um arquivo, outros programas serão realmente impedidos de acessar essa região de uma maneira que viole o bloqueio.Em outros sistemas, se os bloqueios de arquivos nativos são consultivos ou obrigatórios são configuráveis ​​por arquivo.Para garantir um comportamento consistente e correto entre as plataformas, é altamente recomendável que os bloqueios fornecidos por esta API sejam usados ​​como se fossem bloqueios consultivos.

Mesmo se você usar sinalizadores de bloqueio e desbloqueio para o arquivo, você estará apenas garantindo que terá um bloqueio exclusivo dentro do seu aplicativo Java.

Você precisa usar o JNI, ou outra linguagem de computador, para fazer as chamadas do Windows para garantir um bloqueio exclusivo em um arquivo do Windows.

janelas Arquivo de bloqueio função

janelas Desbloquear arquivo função

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top