Я работаю над тем, что использует ByteBuffers, созданный из файлов с отображением памяти (через FileChannel.map()), а также напрямую ByteBuffers в памяти. Я пытаюсь понять ограничения concurrency и памяти.
Я прочитал все соответствующие Javadoc (и источник) для таких вещей, как FileChannel, ByteBuffer, MappedByteBuffer и т.д. Понятно, что конкретный ByteBuffer (и соответствующие подклассы) имеет кучу полей, а состояние не защищено от с точки зрения модели памяти. Таким образом, вы должны синхронизировать при изменении состояния конкретного ByteBuffer, если этот буфер используется в потоках. Обычные трюки включают использование ThreadLocal для обертки ByteBuffer, дублирование (в то время как синхронизация), чтобы получить новый экземпляр, указывающий на одни и те же отображаемые байты и т.д.
Учитывая этот сценарий:
- менеджер имеет отображенный байт-буфер
B_all
для всего файла (скажем, < 2gb) - менеджер вызывает duplicate(), position(), limit() и slice() на B_all, чтобы создать новый меньший ByteBuffer
B_1
, который является фрагментом файла и передает его в поток T1 - менеджер делает все те же вещи, чтобы создать ByteBuffer
B_2
, указывающий на те же отображаемые байты, и передает это потоку T2
Мой вопрос: может ли T1 записывать в B_1 и T2 писать в B_2 одновременно и быть гарантированным, чтобы видеть друг друга? Может ли T3 использовать B_all для чтения этих байтов и гарантировать, что они будут видеть изменения от T1 и T2?
Мне известно, что записи в сопоставленном файле не обязательно просматриваются в разных процессах, если вы не используете force(), чтобы указать ОС записывать страницы на диск. Меня это не волнует. Предположим по этому вопросу, что этот JVM является единственным процессом, записывающим один отображаемый файл.
Примечание: Я не ищу догадок (я могу сам это сделать). Я бы хотел, чтобы ссылки на что-то окончательное о том, что (или нет) гарантировано для непосредственных буферов с отображением памяти. Или, если у вас есть реальный опыт или отрицательные тесты, это также может служить достаточным доказательством.
Обновление:. Я провел несколько тестов с одновременным многократным потоком записи в один и тот же файл, и кажется, что эти записи сразу видны из других потоков. Я не уверен, могу ли я на это положиться.