[concurrency-interest] synchronized constructors

Yuval Shavit yshavit at akiban.com
Fri Dec 16 14:59:21 EST 2011

On Fri, Dec 16, 2011 at 2:10 PM, Zhong Yu <zhong.j.yu at gmail.com> wrote:

> On Fri, Dec 16, 2011 at 8:38 AM, Yuval Shavit <yshavit at akiban.com> wrote:
> > Several people have made the claim that you could see partially
> initialized
> > state even if the constructor were synchronized, and I don't see how this
> > could be. Yes, you could assign MyPoint myUnsafeRef before MyPoint()
> > finishes -- but if you ever tried to *use* myUnsafeRef, you would run
> into a
> > synchronized block which would then ensure that the constructor
> > happened-before whatever method you're writing. Seems to me you should
> see
> > the fully-thread-safe, not-partially-initialized object at that point.
> If the reference is unsafely published, another thread can get the
> reference early; it then calls an instance method which may obtain the
> lock before the creation thread can obtain the lock for the
> constructor. Therefore the other thread can observe the blank state.
> As Ruslan corrected me, no partial state can be observed though.

Ah yes, I hadn't thought of that.

So now, in order to have my class be over-achievingly thread safe, I need
to replace my synchronized methods with a latch that waits for construction
to finish and *then* a synchronized (this) {...}. But I probably decide
that this is really going far out of my way to support a bad usage pattern,
so I throw up my arms and say "you'll see either totally blank or
post-initialization state, but not partial initialization."  But that means
I have to guard against uninitialized state in each method, so I probably
throw up my arms again and say "just publish the darn object safely!"  And
then the JLS people come to me and say, "well if that's your requirement,
why do you want a synchronized constructor?"  And suddenly the whole thing
makes sense.

This has been an interesting discussion for me! Thanks everyone. :)

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cs.oswego.edu/pipermail/concurrency-interest/attachments/20111216/b98cd5e7/attachment.html>

More information about the Concurrency-interest mailing list