#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.