2010-10-23 2 views
6

Sto scrivendo un'applicazione molto concomitante, che modifica estensivamente gli oggetti di MyClass. La classe è composta da diversi campi. La mia domanda è come impedire modifiche di un oggetto particolare durante la sua serializzazione da un altro thread?serializzazione oggetti java - thread safe?

saluti, Matt

risposta

7

Con synchronizing entrambi i metodi che serializzare e modificano lo stato dell'oggetto.

+3

comprese le modifiche allo stato di qualsiasi oggetto secondario (contenuto nei campi dell'oggetto). – Thilo

+3

Mentre la sincronizzazione risolve il problema relativo alla sicurezza dei thread, lo fa serializzando tutti gli accessi, quindi l'applicazione è fondamentalmente a thread singolo e non concorrente. –

4

Perché modificare MyClass? Un approccio migliore (e molto più facile da gestire contemporaneamente) consiste nel creare nuove versioni immutabili del tuo oggetto stato e convertirle in un AtomicReference durante l'aggiornamento. Ad esempio:

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

Quindi la serializzazione non è un problema in quanto si tratta di un oggetto immutabile. Il riferimento memorizzato può solo cambiare da uno stato valido a un altro e più aggiornamenti possono essere eseguiti atomicamente.