Question

Ma question est de savoir si le système d'exploitation respectera l'ordre d'insertion (c'est-à-diredernier écrit, dernier sur le disque) sinon l'ordre sera imprévisible.Par exemple:

    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?

Est-ce toujours le dernier écrit, le dernier entré ou est-ce que j'ai raté quelque chose ici ?

Était-ce utile?

La solution

Je n'ai rien testé, donc je ne sais pas.

Mais franchement, il n’y a aucune garantie sur aucune de ces commandes.

Tu as le mbb.force() méthode, mais ce n'est pas la seule façon d'écrire sur le périphérique, cela garantit simplement qu'il a été écrit.

La VM peut renvoyer la page sur l'appareil quand elle en a envie, en utilisant le calendrier qu'elle juge approprié, ce qui est, naturellement, extrêmement dépendant de la plate-forme (le comportement sous Linux peut être différent de celui sous Windows, il peut même varier de Linux vers Linux ou Windows vers Windows).

Il semble que vous devriez vous coordonner en interne pour vous assurer que vous n'avez qu'un seul tampon de lecture/écriture mappé à une zone spécifique d'un fichier, et gérer les conflits et les chevauchements de cette façon plutôt que de vous fier au système d'exploitation.

Modifier:"les modifications effectuées par plusieurs tampons mappés en mémoire sont garanties d'être cohérentes"

Cela signifie simplement que la machine virtuelle sous-jacente, une fois qu'une page physique est mappée à un processus, ce mappage est partagé entre tous les mappages variés effectués.Les problèmes de thread sont simplement dus à la mise en cache de la mémoire du processeur et à d’autres problèmes.

Ainsi, cela garantit que tous les mappages verront les mêmes données dans un tampon qui se chevauche.Mais cela ne précise pas quand les tampons seront réellement écrits sur le périphérique.Ces points sont toujours d’actualité.

Dans l'ensemble, il semble que vous n'aurez pas de problème si vous gérez correctement les aspects multithreading et sachez que ce que vous voyez dans votre tampon sous-jacent peut "changer sous vos pieds".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top