我在一个场景中,一个进程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
看起来很正常,但它只是不起作用......如何将这些更改同步到磁盘中?或者,即使它不必是