Pergunta

Minha pergunta é se o sistema operacional respeitará o pedido de inserção (ou seja,último escrito, último no disco) ou a ordem será imprevisível.Por exemplo:

    byte[] s1 = "Testing1!".getBytes();
    byte[] s2 = "Testing2!".getBytes();
    byte[] s3 = "Testing3!".getBytes();

    RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
    FileChannel fc = raf.getChannel();
    MappedByteBuffer mbb1 = fc.map(MapMode.READ_WRITE, 0, 1024 * 1024);
    mbb1.put(s1);

    MappedByteBuffer mbb2 = fc.map(MapMode.READ_WRITE, mbb1.position(), 1024 * 1024);
    mbb2.put(s2);

    MappedByteBuffer mbb3 = fc.map(MapMode.READ_WRITE, mbb1.position() + mbb2.position(), 1024 * 1024);
    mbb3.put(s3);

    mbb1.put(s1); // overwrite mbb2
    mbb1.put(s1); // overwrite mbb3

    mbb1.force(); // go to file
    mbb3.force(); // can this ever overwrite mbb1 in the file?
    mbb2.force(); // can this ever overwrite mbb1 in the file?

É sempre o último escrito, o último a entrar ou estou faltando alguma coisa aqui?

Foi útil?

Solução

Não testei nada disso, então não sei.

Mas, francamente, não há garantia de nenhum desses pedidos.

Você tem a mbb.force() método, mas essa não é a única maneira de gravar no dispositivo, mas apenas garante que ele foi gravado.

A VM pode liberar a página de volta para o dispositivo sempre que desejar, usando qualquer agendamento que julgar adequado, o que é, naturalmente, extremamente dependente da plataforma (o comportamento no Linux pode ser diferente do comportamento no Windows, pode até variar de Linux para Linux ou Windows para Windows).

Parece que você deveria coordenar internamente para garantir que tenha apenas um buffer de leitura/gravação mapeado para uma área específica de um arquivo e gerenciar os conflitos e se sobrepor dessa maneira, em vez de depender do sistema operacional.

Editar:"as alterações feitas por vários buffers mapeados na memória têm garantia de consistência"

Simplesmente, isso significa que a VM subjacente, uma vez que uma página física é mapeada para um processo, esse mapeamento é compartilhado por todos os diversos mapeamentos realizados.Os problemas de thread são simplesmente devido ao cache de memória da CPU e outros problemas.

Portanto, isso garante que todos os mapeamentos verão os mesmos dados dentro de um buffer sobreposto.Mas não aborda quando os buffers serão realmente gravados no dispositivo.Esses pontos ainda são pertinentes.

No geral, parece que você não terá problemas se lidar corretamente com quaisquer aspectos de multithreading e esteja ciente de que o que você vê no buffer subjacente pode "mudar sob seus pés".

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