Каков порядок вставки, если у меня есть два буфера с отображением в памяти, сопоставленные одному и тому же файлу?
Мой вопрос заключается в том, будет ли ОС соблюдать порядок вставки (т. Е. Последний записанный, последний на диск) или порядок будет непредсказуемым. Например:
byte[] s1 = "Testing1!".getBytes();
byte[] s2 = "Testing2!".getBytes();
byte[] s3 = "Testing3!".getBytes();
RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
FileChannel fc = raf.getChannel();
MappedByteBuffer mbb1 = fc.map(MapMode.READ_WRITE, 0, 1024 * 1024);
mbb1.put(s1);
MappedByteBuffer mbb2 = fc.map(MapMode.READ_WRITE, mbb1.position(), 1024 * 1024);
mbb2.put(s2);
MappedByteBuffer mbb3 = fc.map(MapMode.READ_WRITE, mbb1.position() + mbb2.position(), 1024 * 1024);
mbb3.put(s3);
mbb1.put(s1); // overwrite mbb2
mbb1.put(s1); // overwrite mbb3
mbb1.force(); // go to file
mbb3.force(); // can this ever overwrite mbb1 in the file?
mbb2.force(); // can this ever overwrite mbb1 in the file?
Это всегда последний раз написано, последний раз или я что-то здесь упускаю?
1 ответ
Я не проверял ничего из этого, поэтому я не знаю.
Но, честно говоря, нет никаких гарантий на этот заказ.
У тебя есть mbb.force()
метод, но это не единственный способ записи на устройство, скорее он просто гарантирует, что оно было записано.
Виртуальная машина может сбросить страницу обратно на устройство, когда захочет, используя любой график, который она сочтет нужным, что, естественно, сильно зависит от платформы (поведение в Linux может отличаться от поведения в Windows, оно может даже отличаться от Linux на Linux или Windows на Windows).
Похоже, что вы должны координировать свои действия внутри страны, чтобы гарантировать, что у вас есть только один буфер чтения / записи, сопоставленный с определенной областью файла, и управлять конфликтами и перекрывать их, а не полагаться на операционную систему.
Редактировать: "изменения, сделанные несколькими буферами с отображением в памяти, гарантированно будут согласованными"
Проще говоря, это означает, что базовая виртуальная машина, как только физическая страница отображается в процессе, это отображение используется совместно для всех выполненных сопоставлений. Проблемы с потоками связаны просто с кэшированием памяти процессора и другими проблемами.
Таким образом, это гарантирует, что все сопоставления будут видеть одни и те же данные в перекрывающемся буфере. Но это не адрес, когда буферы будут фактически записаны на устройство. Эти пункты все еще актуальны.
В целом, похоже, у вас не возникнет проблем, если вы правильно обрабатываете аспекты многопоточности и помните, что то, что вы видите в своем базовом буфере, может "измениться у вас под ногами".