<div dir="ltr"><div>writes cannot be reordered after the synchronized block (MonitorExit), so by the time T2 acquires the monitor it will see the fully published helper.<br></div>the problem would be with other threads that do not acquire the lock.<br><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Aug 4, 2015 at 8:55 PM, luo.fucong <span dir="ltr"><<a href="mailto:bayinamine@gmail.com" target="_blank">bayinamine@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">It is mentioned in the wiki of double-checked locking idiom(<a href="https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java" target="_blank">https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java</a>) that DCL without introducing “volatile” keyword is broken:<br><br>// Broken multithreaded version<br>// "Double-Checked Locking" idiom<br>class Foo {<div>    private Helper helper;<div><br></div>    public Helper getHelper() {<br>        if (helper == null) {    <br>            synchronized(this) {    <br>                if (helper == null) {    <br>                    helper = new Helper();<br>                }<br>            }<br>        }    <br>        return helper;<br>    }<br><br></div><div>    // other functions and members…<br>}<br><br></div><div>It’s broken because a thread may obtain a partially constructed object (the variable “helper” may be initialized before constructor “new Helper()” finished due to reordering).</div><div><br></div><div>I am wondering is there another possible of why that is broken that, the “helper” may be initialized more than once?</div><div><br></div><div>Say Thread1 and Thread2 are now concurrently trying to get the helper instance, and T1 obtains the monitor(enter the synchronized block) while T2 waits.</div><div><br></div><div>Then T1 initialized the helper and returned, T2 entered the synchronized block. However, without the “volatile” keyword, T2 may not see the update of the helper variable that were made by T1. So T2 may think that "helper == null” is true, and thus initialize the helper again.</div><div><br></div><div>Is the above possible? Thanks in advance!</div></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" rel="noreferrer" target="_blank">http://cs.oswego.edu/mailman/listinfo/concurrency-interest</a><br>
<br></blockquote></div><br></div>