java NIO MappedByteBuffer не синхронизирует изменения содержимого

Я нахожусь в сцене, когда несколько потоков одного процесса A будут одновременно записывать в несколько файлов, а затем несколько потоков процесса B будут считывать из этих файлов и восстанавливать содержимое после завершения процесса A. Содержание может быть огромным, и говорят, что MappedByteBuffer может ускорить это. Однако я обнаружил, что изменения, которые я записал, не попадают в реальный файл, потому что, когда я проверяю содержимое файла, используя xxd Команда после завершения процесса записи показывает все нули (я уверен, что байты реального содержимого не все равны нулю, потому что я его распечатаю)

Для решения проблемы параллелизма я поддерживал AtomicInteger чтобы убедиться, что только после того, как все потоки закончили свою работу, я бы force() изменения на диске. Вот основной код.

public void flush() {
    if(flushcount.incrementAndGet() >= threads_num.get()) //both are of type AtomicInteger
        finalflush();
}

private void finalflush() {
    flushlock.lock();
    try {
        //key is file name, value is the corresponding MappedByteBuffer
        //the limit of the file is set to 10M manually based on my needs
        for(Map.Entry<String, MappedByteBuffer> map:files.entrySet()){
            System.out.printf("%s : pos = %d, limit = %d\n", map.getKey(), map.getValue().position(), map.getValue().limit());
            map.getValue().force();
            map.getValue().load();
        }

        for(Map.Entry<String, FileChannel> map: channels.entrySet()) {
             map.getValue().close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        flushlock.unlock();
    }
}

Вывод таков

QUEUE_3: pos = 43112, предел = 10485760
QUEUE_4: pos = 42407, предел = 10485760
QUEUE_5: pos = 43254, предел = 10485760
TOPIC_3: pos = 395296, предел = 10485760
TOPIC_2: pos = 401236, предел = 10485760
TOPIC_1: pos = 398728, предел = 10485760
TOPIC_0: pos = 392744, предел = 10485760

Кажется вполне нормальным, но это просто не работает... Как я могу синхронизировать эти изменения на диске? Или, даже если это не должно быть

0 ответов

Другие вопросы по тегам