I am using MappedByteBuffer to speed up file read/write operations(). My questions as below:
I am not sure if I need to use .force() method to flush the content to disk or not. It seems like without .force(), the .getInt() can still work perfectly (well, since this is a memory-mapped buffer, i assume .getInt() fetches the data from disk, which means the data has been flushed into disk already.
Is the .force() method a blocking method?
Is a blocking method a synchronized block?
There is a huge performance difference with or without calling .force() method. What's the benefit of calling .force() manually? Under which situation should we use it? I assume without calling it, the data will still be written to disk behind the scene.
If we needs to call .force(), will calling it from another thread helps to improve performace? Will it corrupt the data because of synchronization problem?
import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileChannel.MapMode;
public class Main {
public static void main(String[] args) throws IOException {
System.out.println("start");
RandomAccessFile raf = new RandomAccessFile("test.map", "rw");
FileChannel fc = raf.getChannel();
MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0, 2000000);
int total = 0;
long startTime = System.currentTimeMillis();
for (int i = 0; i < 2000000; i += 4) {
mbb.putInt(i, i);
//mbb.force();
total += mbb.getInt(i);
}
long stopTime = System.currentTimeMillis();
System.out.println(total);
System.out.println(stopTime - startTime);
System.out.println("stop");
}
}