Безопасно ли ObjectOutputStream.writeObject для файлового потока? - PullRequest
2 голосов
/ 02 апреля 2020

Я работаю над приложением, которое должно сериализовать объекты в файл для последующего использования. Существует несколько потоков, вызывающих метод writeObject (для разных объектов, одного и того же файла) одновременно. Является ли метод потокобезопасным? Нужно ли синхронизировать операцию записи в коде приложения?

Например: поток 1 сериализует объект A, поток 2 сериализует объект B. Если бы я не синхронизировал их, смешались бы A и B с каждым другой в файле? Спасибо!

Ответы [ 3 ]

1 голос
/ 02 апреля 2020

Во-первых, Java Сериализация опасна , поэтому ее следует избегать.

Нет, ObjectOutputStream не поточно-ориентированный . Похоже, API не претендует на это. Вы также можете проверить исходный код, где для безопасности существует только безопасность потоков.

Это не поток-враждебный , поэтому вы можете одновременно записывать в два независимых ObjectOutputStream.

OutputStream с java.nio.file.Files.newOutputStream​ являются потоко-безопасными , но это не присваивается автоматически "декораторам".

Writer s имеют некоторую явную блокировку, но делает абсолютное свиное ухо.

1 голос
/ 02 апреля 2020

Это зависит. Если они пишут в один и тот же файл, то да, это должно быть синхронизировано. Но это обычно верно даже вне сериализации объекта: если у вас есть два или более потоков, пишущих в один и тот же поток, они должны быть синхронизированы.

Если каждый из них пишет в свои собственные потоки / файлы, то у вас нет конфликта ресурсов, и это будет поточно-ориентированным

0 голосов
/ 02 апреля 2020

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

...