Я использую MappedByteBuffer для ускорения операций чтения/записи файлов(). Мои вопросы, как показано ниже:Нужно ли использовать MappedByteBuffer.force() для сброса данных на диск?
Я не уверен, если мне нужно использовать .force() метод, чтобы очистить содержимое на диск или нет. Похоже, что без .force() функция .getInt() может работать отлично (ну, так как это буфер с отображением памяти, я предполагаю, что .getInt() извлекает данные с диска, что означает, что данные были сброшены в диск уже.
является ли метод .force() метод блокировки?
ли способ блокировки синхронизированный блок?
Существует огромная разница в производительности с или без вызова .force (). Какая польза от вызова .force() вручную? В какой ситуации мы должны использовать его? Я предполагаю, что без его вызова данные будут записаны на диск за сценой.
Если нам нужно позвонить в .force(), вызовет ли он из другого потока, чтобы улучшить производительность? Будет ли это повреждать данные из-за проблемы синхронизации?
импорт java.io.FileNotFoundException; импорт java.io.IOException; import java.io.RandomAccessFile; импорт java.nio.MappedByteBuffer; импорт java.nio.channels.FileChannel; импорт java.nio.channels.FileChannel.MapMode;
общественного класса 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");
}
}
Версия JDK? (не то, чтобы это действительно сильно изменилось) –
Я не вижу, какая разница. – EJP
Нет, посмотрев на Javadoc :-) –