[concurrency-interest] synchronized constructors

R Samuel Klatchko rsk at moocat.org
Thu Dec 15 16:19:01 EST 2011


The issue you are describing is only possible if the constructor is called
in one thread and toString is called in a different thread.

If you are doing that, your code will want to take care of the
happens-before edge as part of sending the reference from the thread that
constructs the object to the thread that uses the object.

samuel

On Thu, Dec 15, 2011 at 1:10 PM, Yuval Shavit <yshavit at akiban.com> wrote:

> Hi all,
>
> This came up a few days ago on stackoverflow.com -- I forget the exact
> post, but someone referenced the JLS section concerning why constructors
> can't be synchronized:
>
> There is no practical need for a constructor to be synchronized, because
>> it would lock the object under construction, which is normally not made
>> available to other threads until all constructors for the object have
>> completed their work.
>
>
> If synchronization were only about mutual exclusion, this would make
> sense; but it also has memory visibility guarantees. For instance, say I
> have this really simple class:
>
>     public class MyPoint {
>         private int x;
>         private int y;
>
>         public MyPoint() {
>             x = -1; // init to (-1,-1) for some reason
>             y = -1;
>         }
>
>         public synchronized void setX(int x, int y) {
>             this.x = x;
>             this.y = y;
>         }
>
>         @Override
>         public synchronized String toString() {
>             return "(" + x + ", " + y + ")";
>         }
>     }
>
> There's a thread safety issue there, right? There was no synchronization
> during construction time, and thus no happens-before between ctor ending
> and toString() starting, so with reordering etc, you could observe the
> initial state as "(0, 0)", "(-1, 0)", "(-1, -1)" or "(-1, 0)".  You could
> get around this by calling setX from the constructor, but if setX is
> non-final, that has its own issues. You could also put the x and y
> initialization within a synchronized (this) { ... } -- but at that point,
> why not just allow the constructor to be synchronized?
>
> Thanks,
> Yuval
>
> _______________________________________________
> Concurrency-interest mailing list
> Concurrency-interest at cs.oswego.edu
> http://cs.oswego.edu/mailman/listinfo/concurrency-interest
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cs.oswego.edu/pipermail/concurrency-interest/attachments/20111215/0102892d/attachment.html>


More information about the Concurrency-interest mailing list