当使用 StandardOpenOption.SYNC 打开底层通道时,我们是否必须刷新 MappedByteBuffer
Do we have to flush MappedByteBuffer when underlying channel is opened with StandardOpenOption.SYNC
StandardOpenOption.SYNC 是否可以与 MappedByteBuffers 一起使用并避免我们调用 MappedByteBuffer.force()?
Set<OpenOption> options = new HashSet<>();
options.add(StandardOpenOption.READ);
options.add(StandardOpenOption.WRITE);
options.add(StandardOpenOption.CREATE);
options.add(StandardOpenOption.SYNC);
FileChannel channel = FileChannel.open("file.tmp", options);
MappedByteBuffer buf = channel.map(FileChannel.MapMode.READ_WRITE, 0, channel.size());
buf.putInt(500);
buf.force(); // Needed or not?
编辑:
我假设 jdk 使用 O_SYNC 标志和 mmap() 调用,所以将这个问题扩展到 linux 世界:打开底层 fd 时我们是否必须调用 msync()使用 O_SYNC 标志 ?
我找不到文档来验证它。
在使用和不使用 SYNC 选项的 linux/windows 上进行测试,性能相似,因此我假设文件选项 SYNC/O_SYNC 不适用于 mmap/MappedByteBuffer 操作。
StandardOpenOption.SYNC 是否可以与 MappedByteBuffers 一起使用并避免我们调用 MappedByteBuffer.force()?
Set<OpenOption> options = new HashSet<>();
options.add(StandardOpenOption.READ);
options.add(StandardOpenOption.WRITE);
options.add(StandardOpenOption.CREATE);
options.add(StandardOpenOption.SYNC);
FileChannel channel = FileChannel.open("file.tmp", options);
MappedByteBuffer buf = channel.map(FileChannel.MapMode.READ_WRITE, 0, channel.size());
buf.putInt(500);
buf.force(); // Needed or not?
编辑:
我假设 jdk 使用 O_SYNC 标志和 mmap() 调用,所以将这个问题扩展到 linux 世界:打开底层 fd 时我们是否必须调用 msync()使用 O_SYNC 标志 ?
我找不到文档来验证它。
在使用和不使用 SYNC 选项的 linux/windows 上进行测试,性能相似,因此我假设文件选项 SYNC/O_SYNC 不适用于 mmap/MappedByteBuffer 操作。