У меня есть приложение (Java5), распределенное между несколькими JVM, которое читает/записывает файлы из общего хранилища (хранилище управляется Windows). Я хотел использовать эксклюзивные/общие блокировки для записи/чтения файлов следующим образом:
FileOutputStream fos = null;
FileLock lock = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream(new File("//share/test.dat")); // HERE IT MAY THROW FileNotFoundException...
lock = fos.getChannel().lock(); // ... and I won't acquire a lock.
oos = new ObjectOutputStream(fos);
oos.writeObject(value);
return true;
} catch (Exception e) {
// Log it.
} finally {
// Close locks and I/O streams.
}
Проблема: если JVM1 в данный момент читает файл test.dat, а JVM2 пытается записать в тот же файл, возникает исключение FileNotFoundException ("Процесс не может получить доступ к файлу, поскольку он используется другим процессом") будет выброшено на JVM2 в строке "new FileOutputStream(new File("//share/test.dat"))". Это похоже на случай Catch22: с одной стороны, я хочу получить блокировку, чтобы получить поток ввода-вывода; с другой стороны, мне нужно иметь поток ввода-вывода, чтобы получить блокировку. Как я мог видеть, такая же ситуация и с RandomAccessFile.
Любые идеи?..