2010-10-23 12 views
6

J'écris une application hautement concurrente, qui modifie considérablement les objets de MyClass. La classe est composée de plusieurs champs. Ma question est de savoir comment empêcher les modifications d'un objet particulier lors de sa sérialisation par un autre thread?sérialisation d'objet java - thread sûr?

Regards, Matt

Répondre

7

Par synchronizing deux méthodes qui sérialiser et modifient l'état de l'objet.

+3

y compris les modifications de l'état de tous les sous-objets (contenus dans les champs de l'objet). – Thilo

+3

Alors que la synchronisation résout votre problème de sécurité des threads, elle le fait en sérialisant tous les accès, donc votre application est fondamentalement mono-thread et pas du tout concurrente. –

4

Pourquoi modifier MyClass? Une meilleure approche (et beaucoup plus facile à gérer simultanément) est de créer de nouvelles versions immuables de votre objet d'état et de les CAS avec un AtomicReference lors de la mise à jour. Par exemple:

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);} 
} 

Ensuite, la sérialisation n'est pas un problème car vous avez affaire à un objet immuable. Votre référence stockée peut uniquement passer d'un état valide à un autre et plusieurs mises à jour peuvent être effectuées de manière atomique.