Pracuję nad aplikacją, która ma serializować obiekty do pliku do późniejszego wykorzystania. Istnieje wiele wątków wywołujących metodę writeObject (dla różnych obiektów, tego samego pliku) jednocześnie. Czy metoda jest bezpieczna wątkowo? Czy muszę synchronizować operację zapisu w kodzie aplikacji?

Na przykład: Wątek 1 serializuje obiekt A, Wątek 2 serializuje obiekt B. Gdybym ich nie zsynchronizował, czy A i B zostaną pomieszane ze sobą w pliku? Dzięki!

2
baopdh 2 kwiecień 2020, 18:16

3 odpowiedzi

Najlepsza odpowiedź

Po pierwsze, serializacja Java jest niebezpieczna, więc należy jej unikać.

Nie, ObjectOutputStream nie jest zabezpieczony wątkami . Wygląda na to, że API nie ma na ten temat żadnych roszczeń. Możesz również sprawdzić kod źródłowy, w którym dla bezpieczeństwa jest tylko ochrona wątków.

Nie jest wrogo nastawiony do wątku , więc możesz pisać do dwóch niezależnych ObjectOutputStream jednocześnie.

OutputStream z java.nio.file.Files.newOutputStream​ bezpieczne dla wątków , ale nie jest to automatycznie przyznawane „dekoratorom”.

Writer mają pewne wyraźne blokady, ale robią z tego absolutne świńskie ucho.

1
Tom Hawtin - tackline 2 kwiecień 2020, 15:53

To zależy. Jeśli piszą do tego samego pliku, to tak, należy to zsynchronizować. Ale generalnie jest to prawdą nawet poza serializacją obiektów: jeśli masz dwa lub więcej wątków piszących do tego samego strumienia, należy je zsynchronizować.

Jeśli każdy z nich pisze do swoich własnych strumieni / plików, nie masz konfliktu zasobów i byłoby to bezpieczne dla wątków

1
ControlAltDel 2 kwiecień 2020, 15:23

Jeśli wiele wątków zapisuje do tego samego pliku, musisz zsynchronizować metodę zapisu, ponieważ ObjectOutputStream nie jest zabezpieczony wątkowo po wyjęciu z pudełka. Możesz skończyć z pomieszaniem wyników i różnego rodzaju problemami z wątkami.

0
Varun Maurya 2 kwiecień 2020, 16:14