<p dir="ltr">You can get null if the following (valid) transformation is done:</p>
<p dir="ltr">Resource tmp = resource; // null here<br>
if (resource != null) // resource not null here<br>
{<br>
    resource = tmp = new Resource();<br>
}<br>
return tmp; // returns null</p>
<p dir="ltr">If resource is marked volatile, then everything's fine and above cannot occur.</p>
<p dir="ltr">Also, with data race publishing, you can also observe a non-null reference but not see the writes done in the constructor if Resource has non-final fields.</p>
<p dir="ltr">The above reordering is why String.hashCode only deals with the temp value explicitly.</p>
<p dir="ltr">Sent from my phone</p>
<div class="gmail_quote">On Feb 3, 2013 1:42 PM, "Yann Le Tallec" <<a href="mailto:ylt@letallec.org">ylt@letallec.org</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hello,<br>
<br>
I have a couple of questions regarding the following class:<br>
<br>
public class SomeClass {<br>
  private static Resource resource = null; //w0<br>
<br>
  public static Resource getInstance() {<br>
    if (resource == null)                  //r1<br>
      resource = new Resource();           //w1<br>
    return resource;                       //r2<br>
  }<br>
}<br>
<br>
(1) Can getInstance() return null?<br>
<br>
Example of an execution that returns null, with three threads T0, T1 and T2:<br>
- T0 initialises resource to null (write w0)<br>
- T1 reads null at r1 and assigns a new Resource instance to resource (write w1)<br>
- T1 returns a non null value<br>
- T2 reads w1 at r1 in the if condition and does not execute the if body<br>
- T2 reads w0 at r2 and returns null<br>
<br>
The execution seems happens-before consistent as both w0 and w1 are<br>
observable by r1 and r2 (but I'm not sure if it is valid with regards<br>
to the causality requirements of the JMM).<br>
This possible reordering is one of the reasons why String#hashcode<br>
uses a local variable I believe.<br>
<br>
(2) Same question with resource declared as "private static Resource<br>
resource;" (without the "= null") and with the additional assumption<br>
that Resource is immutable<br>
<br>
- I am told that "Resource resource; can't race whereas Resource<br>
resource = null; can", but I don't see why they are different from a<br>
JMM perspective.<br>
- The resource variable being non-final, I don't think immutability<br>
makes a difference here as null is still a valid and observable value.<br>
<br>
Regards,<br>
Yann<br>
<br>
ps: JCiP has an UnsafeLazyInitialization example similar to SomeClass<br>
(without the "=null") and states in 16.3 that it would be safe if<br>
Resource were immutable, so I guess I'm missing something and that<br>
null is not a possible outcome.<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>
</blockquote></div>