The issue you are describing is only possible if the constructor is called in one thread and toString is called in a different thread.<div><br></div><div>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.</div>
<div><br></div><div>samuel<br><br><div class="gmail_quote">On Thu, Dec 15, 2011 at 1:10 PM, Yuval Shavit <span dir="ltr"><<a href="mailto:yshavit@akiban.com">yshavit@akiban.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi all,<div><br></div><div>This came up a few days ago on <a href="http://stackoverflow.com" target="_blank">stackoverflow.com</a> -- I forget the exact post, but someone referenced the JLS section concerning why constructors can't be synchronized:</div>


<div><br></div><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


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.</blockquote>


<div><br></div><div>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:</div><div><div><br></div></div>


<div><div><font face="'courier new', monospace">    public class MyPoint {</font></div><div><font face="'courier new', monospace">        private int x;</font></div>

<div><font face="'courier new', monospace">        private int y;</font></div><div><font face="'courier new', monospace">    </font></div><div><font face="'courier new', monospace">        public MyPoint() {</font></div>


<div><font face="'courier new', monospace">            x = -1; // init to (-1,-1) for some reason</font></div><div><font face="'courier new', monospace">            y = -1;</font></div>

<div><font face="'courier new', monospace">        }</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">        public synchronized void setX(int x, int y) {</font></div>


<div><font face="'courier new', monospace">            this.x = x;</font></div><div><font face="'courier new', monospace">            this.y = y;</font></div>

<div><font face="'courier new', monospace">        }</font></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">        @Override</font></div>


<div><font face="'courier new', monospace">        public synchronized String toString() {</font></div><div><font face="'courier new', monospace">            return "(" + x + ", " + y + ")";</font></div>


<div><font face="'courier new', monospace">        }</font></div><div><font face="'courier new', monospace">    }</font></div></div><div><br></div><div>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?</div>


<div><br></div><div>Thanks,</div><div>Yuval</div>
<br>_______________________________________________<br>
Concurrency-interest mailing list<br>
<a href="mailto:Concurrency-interest@cs.oswego.edu">Concurrency-interest@cs.oswego.edu</a><br>
<a href="http://cs.oswego.edu/mailman/listinfo/concurrency-interest" target="_blank">http://cs.oswego.edu/mailman/listinfo/concurrency-interest</a><br>
<br></blockquote></div><br></div>