2010-10-23 14 views
6

Piszę wysoce współbieżną aplikację, która znacznie modyfikuje obiekty MyClass. Klasa składa się z kilku pól. Moje pytanie brzmi: jak zapobiec modyfikacjom konkretnego obiektu podczas jego serializacji przez inny wątek?serializacja obiektów java - wątek bezpieczny?

Chodzi, Mt

Odpowiedz

7

przez synchronizing obu metod, szeregowo i zmieniają stan obiektu.

+3

w tym modyfikacje stanu wszelkich pod-obiektów (zawartych w polach obiektu). – Thilo

+3

Podczas gdy synchronizacja rozwiązuje problem związany z bezpieczeństwem wątków, robi to serializując cały dostęp, dlatego aplikacja jest w zasadzie jednoprzekrojowa, a nie współbieżna. –

4

Po co modyfikować MyClass? Lepszym podejściem (i znacznie łatwiejszym w obsłudze) jest utworzenie nowych, niezmiennych wersji twojego obiektu stanu oraz CAS z AtomicReference podczas aktualizacji. Np .:

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

Następnie serializacja nie stanowi problemu, ponieważ mamy do czynienia z niezmiennym obiektem. Zapisane odniesienie może zmienić się tylko z jednego prawidłowego stanu na inny, a wiele aktualizacji może być przeprowadzanych atomowo.

Powiązane problemy