<div dir="ltr"><div style="font-size:12.8px">Object o = new Object();</div><div style="font-size:12.8px"><span style="font-size:12.8px">synchronized(o){</span><br></div><div><div style="font-size:12.8px">  </div><div style="font-size:12.8px">}</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><span style="font-size:small">The reason this code looks incorrect is that 'o' is not shared and not known to any other thread.</span></div><div style="font-size:12.8px"><span style="font-size:small">Therefore you can't possibly be achieving any synchronization with any other thread.</span></div><div style="font-size:12.8px"><span style="font-size:small"><br></span></div><div style="font-size:12.8px"><span style="font-size:small">Consider slightly modified example</span></div><div style="font-size:12.8px"><span style="font-size:small"><br></span></div><div style="font-size:12.8px"><span style="font-size:small">// Not local (outside of your function)</span></div><div style="font-size:12.8px"><span style="font-size:small">volatile Object lock = null;</span></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">// Local code</div><div style="font-size:12.8px"><div style="font-size:12.8px">Object o = new Object();</div><div style="font-size:12.8px"><span style="font-size:12.8px">synchronized(o){</span><br></div><div style="font-size:12.8px"><div>  lock = o;</div><div>}</div></div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">While this code has some other issues. At least it's potentially meaningful. It will acquire the lock on 'o' and will publish it to the outside world</div><div>Now some other thread can find and synchronize on it</div><div style="font-size:12.8px"><span style="font-size:small"><br></span></div></div><div style="font-size:12.8px"><span style="font-size:small">Look at the next line in computeIfAbsent</span></div><div style="font-size:12.8px"><span style="font-size:small">It publishes that lock 'r' in casTabAt()   </span></div><div style="font-size:12.8px"><span style="font-size:small"><br></span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 15, 2016 at 10:21 AM, Sleiman Jneidi <span dir="ltr"><<a href="mailto:jneidi.sleiman@gmail.com" target="_blank">jneidi.sleiman@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 dir="ltr">Hi everyone, <div><br></div><div>From what I know, locking on local variables is useless, Brian Goetz in his book gave the following as an example of a bad lock</div><div><br></div><div> synchronized(new Object()){</div><div>  ..</div><div> }</div><div><br></div><div>So I assume, the code above is equivalent to the following</div><div><br></div><div>  Object o = new Object();</div><div>  </div><div><div> synchronized(o){</div><div>  ..</div><div> }</div></div><div><br></div><div>However looking at ConcurrentHashMap#computeIfAbsent I see the following</div><div><br></div><div>Node<K,V> r = new ReservationNode<K,V>();<br></div><div><div>    synchronized (r) {</div><div>    ...</div><div>    }</div></div><div><br></div><div>Just curious, why is that?</div><div><br></div><div><br></div><div>Thanks</div><span class="HOEnZb"><font color="#888888"><div>Sleiman </div><div><br></div></font></span></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>