aspose file tools
The moose likes Threads and Synchronization and the fly likes question about safe publish and threadsafe for immutable object Big Moose Saloon
  Search | Java FAQ | Recent Topics
Register / Login
JavaRanch » Java Forums » Java » Threads and Synchronization
Reply Bookmark "question about safe publish and threadsafe for immutable object" Watch "question about safe publish and threadsafe for immutable object" New topic
Author

question about safe publish and threadsafe for immutable object

Robert Strong
Ranch Hand

Joined: Sep 10, 2002
Posts: 84
hi, i'm new in multi-threading, i'm a little confused about safe publish and threadsafe of immutable object.

I know that immutable object is always threadsafe and can always be safely published thanks to initialization safety. does this mean that in the following code, the update() is threadsafe without synchronization?

public Cache {
private ImmutableObject holder;

public update(...) {
....
holder = new ImmutableObject(...);
}
}


any help is appreciated!
Mike Simmons
Ranch Hand

Joined: Mar 05, 2008
Posts: 2782
    
    2
No. While data within the ImmutableObject is safe (assuming it is, indeed, a properly-written immutable object), the reference "holder" is mutable, and not safe. This may or may not be a problem, depending what you do with it. But some threads may see an older, out-of-date value for the holder. And if you need to do conditional actions based on the state of the holder, e.g. update the holder if and only if it is null - that sort of thing can go badly wrong here unless you use synchronization, volatile, or other techniques.
Robert Strong
Ranch Hand

Joined: Sep 10, 2002
Posts: 84
Mike, thank you for your quick reply.

you said reference "holder" is mutable, other threads might see stale value of holder, but will initialization safety guaranty the most recent writes are visible to other threads?

Mike Simmons
Ranch Hand

Joined: Mar 05, 2008
Posts: 2782
    
    2
It's guaranteed that all data inside ImmutableObject (i.e., fields declared within that class) will be fully initialized, and observable as such from any thread that can reference a given ImmutableObject instance. But this guarantee does not, in any way, apply to the "holder" reference. Other threads may or may not see the most recent writes that have been made. But whatever they see, it will be a reference to a single, self-consistent object. It may be a single old self-consistent object, not the one you were expecting. But it won't be some mutant mishmash of two different objects.

Let's say ImmutableObject has two final fields, a String and an int, with an appropriate constructor and two getter methods. And let's say one thread executes something like


Sometime later, another thread executes


And then a short while later, yet another thread tries to read the value of "holder". They may well see an object with values of "B" and 2. Or they may, perhaps, see an object with values "A" and 1. That's an old, out-of-date object, but it's self-consistent. But they will never, ever see an object with values "A" and 2, or with values "B" and 1. Those are inconsistent - no object with such values was ever created.

However, if you drop the "final" from the declarations of both fields, then you no longer have a proper immutable object. (Well, unless you resort to other more complex techniques; I'm keeping this simple.) In this case you can observe an object with values of "A" and 2, or "B" and 1. Or "A" and 0, or null and 1, or null and 0. (The original default values may still be in place for some fields.) Weird stuff can happen if your object is not truly immutable.
Robert Strong
Ranch Hand

Joined: Sep 10, 2002
Posts: 84
Mike, thank you for your detailed, insightful descriptions.
 
I agree. Here's the link: http://ej-technologies/jprofiler - if it wasn't for jprofiler, we would need to run our stuff on 16 servers instead of 3.
 
subject: question about safe publish and threadsafe for immutable object
 
Similar Threads
do not publish partially initialized objects?
Threads 002
Using "this" keyword in parent class thread safe?
Is this class thread safe
Why String is Immutable ?