0

我在一个场景中,一个进程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,limit = 10485760
queue_4:pos = 42407,limit = 10485760
queue_5:pos = 43254,limit limit = 10485760
topic_3:pos = 395296,limit = 395296,limit = 10485760
topic_ topic_ topic_ topic_ topic
= 4011236,401236,401236,401236,401236,4 , 限制 = 10485760
TOPIC_0 : 位置 = 392744, 限制 = 10485760

看起来很正常,但它只是不起作用......如何将这些更改同步到磁盘中?或者,即使它不必是

4

0 回答 0