2013-03-11 4 views
0

Есть ли способ разрешить нескольким потокам выполнять операции чтения/записи в RandomAccessFile одновременно, то есть одновременно? Должен ли я использовать любой объект синхронизации, или это можно сделать без какой-либо синхронизации?Как разрешить нескольким потокам одновременный доступ к файлу произвольного доступа в Java

+1

Посмотрите на http://stackoverflow.com/questions/464784/java-reentrantreadwritelocks-how-to-safely-acquire-write-lock. Лучше всего использовать базу данных, такую ​​как http://www.sqlite.org или другой. –

ответ

0

Вы должны использовать какой-то метод синхронизации. В файле может быть только одна позиция файла. Если вы попробуете одновременный доступ без синхронизации, поведение в лучшем случае непредсказуемо.

1

Как сказал Эрик, должен быть механизм синхронизации. В противном случае это станет проблемой «Читатели/Писатели».

Если вам нужно ускорить работу, вы можете иметь несколько чтений вместе, и всякий раз, когда вам нужно писать, останавливать новые запросы на чтение, оставлять существующий запрос завершенным, получать блокировку, записывать в файл, освобождать блокировку.

ReentrantReadWriteLock может вам помочь.

+1

Если RandomFileAccess не является абсолютным требованием, можно также взглянуть на то, что предоставляет java.nio.channels.FileChannel с точки зрения произвольного доступа, общей/эксклюзивной блокировки (сегментов) файла и прямого отображения в памяти с помощью напишите. Хотя, как и RandomAccessFile, FileChannel имеет только одну позицию в любой момент времени, сохраняя необходимость синхронизации в какой-то момент. – GPI

+0

Не было сказано, что файл будет доступен только через один FileChannel, дескриптор файла или что-то еще. – Ingo

1

Файл с произвольным доступом ведет себя так же, как и оперативное запоминающее устройство - он открыт для всех видов гонок данных. Следовательно, до тех пор, пока вы не видите, что разные потоки работают в разных регионах файла, вы абсолютно должны использовать синхронизацию.

Смежные вопросы