2010-10-23 5 views
6

Я пишу высоко одновременное приложение, которое интенсивно изменяет объекты MyClass. Класс состоит из нескольких полей. Мой вопрос заключается в том, как предотвратить модификации конкретного объекта во время его сериализации другим потоком?сериализация объектов Java - потокобезопасная?

С уважением, Matt

ответ

7

По synchronizing обоих методов, которые сериализующих и изменять состояние объекта.

+3

включая модификации состояния любых под-объектов (содержащихся в полях объекта). – Thilo

+3

В то время как синхронизация решает проблему безопасности потоков, она делает это путем сериализации всего доступа, поэтому ваше приложение в основном однопоточное, а не параллельное вообще. –

4

Зачем изменять MyClass? Лучшим подходом (и намного легче справляться с этим) является создание новых неизменных версий объекта состояния и CAS с помощью AtomicReference при обновлении. Например:

final class MyClass { 
    final int age; 
    final String name; 
    final String address; 

    MyClass(int age, String name, String address) {…} 

    MyClass setNameAndAddress(String name, String address) {return new MyClass(age, name, address);} 
} 

Тогда сериализация не является проблемой, так как вы имеете дело с неизменяемым объектом. Ваша сохраненная ссылка может изменяться только из одного действительного состояния в другое, а несколько обновлений могут выполняться атомарно.