Могут ли две разные программы выполнять синхронизацию в одном и том же файле для ввода-вывода?

#java #serialization #concurrency #nio

#java #сериализация #параллелизм #nio

Вопрос:

У нас есть ситуация, когда две разные программы main () обращаются к одному и тому же файлу для операции чтения / записи.

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

Цель состоит в том, чтобы предотвратить операцию чтения во время выполнения операции записи.

Я могу получить блокировку для файла, используя java.nio.channels.FileChannel.lock() . Но теперь я не могу выполнить запись в файл с помощью ObjectOutputStream, поскольку блокировка приобретается FileChannel .

Основной метод записи выглядит так, как указано ниже:

 public static void main(String args[]) {
try {
HashMap<String, Double> h = new HashMap<>();
File f = new File("C:\Sayan\test.txt");
FileChannel channel = new RandomAccessFile(f, "rw").getChannel();
FileLock lock = channel.lock();
System.out.println("Created File object");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
System.out.println("Created output stream");
oos.writeObject(h);
lock.release();
 } catch (Exception e) {
  e.printStackTrace();
}
  

}

Операция чтения также аналогична, она просто считывает данные из файла, измененного приведенным выше кодом.

Ограничения: мы не можем создать какой-либо другой класс или поток для достижения синхронизации.

Еще одно сомнение: могут ли потоки, созданные двумя разными основными программами, взаимодействовать друг с другом?

Ответ №1:

Получите канал, с которым вы блокируете, из FileOutputStream , а не из отдельного RandomAccessFile.