views:

73

answers:

2

Hi,

I am writing highly concurrent application, which is extensively modifies objects of MyClass. The class is composed of several fields. My question is how to prevent modifications of particular object during its serialization by another thread?

Regards, Matt

+4  A: 

By synchronizing both the methods which serialize and modify the object state.

Darin Dimitrov
including modifications to the state of any sub-objects (contained in the object's fields).
Thilo
While synchronizing solves your thread-safety concern, it does so by serializing all access, therefore your application is basically single-threaded and not concurrent at all.
Jed Wesley-Smith
+1  A: 

Why modify MyClass? A better approach (and much easier to deal with concurrently) is to create new immutable versions of your state object and CAS them with an AtomicReference when updating. Eg:

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

Then serialization is not a problem as you are dealing with an immutable object. Your stored reference can only change from one valid state to another, and multiple updates can be performed atomically.

Jed Wesley-Smith