These classes are designed to work with JDK6 as well as JDK7.<div><br></div><div>AbstractQueuedSynchronizer has been written so that interrupts can never cause signals to be lost.  If this were not the case, there would be many more places than just in ArrayBlockingQueue where special handling of interrupts would be required (and getting concurrent classes right is already hard enough).  Implementation of ABQ has merely been simplified to rely on AQS's de-facto guarantee.</div>
<div><br>This ought to be better documented.  </div><div><br></div><div>I would like to see the classes in j.u.c.locks document more guarantees than they currently do.</div><div>For example, I'd like to see this guarantee:</div>
<div><br></div><div><div>diff -u -r1.96 ReentrantLock.java</div><div>--- main/java/util/concurrent/locks/ReentrantLock.java<span class="Apple-tab-span" style="white-space:pre">    </span>9 Jun 2011 07:48:44 -0000<span class="Apple-tab-span" style="white-space:pre">   </span>1.96</div>
<div>+++ main/java/util/concurrent/locks/ReentrantLock.java<span class="Apple-tab-span" style="white-space:pre">        </span>10 Nov 2011 14:00:08 -0000</div><div>@@ -467,6 +467,9 @@</div><div>      * but for <em>fair</em> locks favors those threads that have been</div>
<div>      * waiting the longest.</div><div>      *</div><div>+     * <li>None of the condition {@linkplain Condition#await() waiting}</div><div>+     * methods ever return due to a &quot;<em>spurious wakeup</em>&quot;.</div>
<div>+     *</div><div>      * </ul></div><div>      *</div><div>      * @return the Condition object</div></div><div><br></div><div>Martin<br><br><div class="gmail_quote">On Thu, Nov 10, 2011 at 05:15, Dr Heinz M. Kabutz <span dir="ltr"><<a href="mailto:heinz@javaspecialists.eu">heinz@javaspecialists.eu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">In Java 6, the ArrayBlockingQueue used this construct for the take() method:<br>
<br>
   public E take() throws InterruptedException {<br>
       final ReentrantLock lock = this.lock;<br>
       lock.lockInterruptibly();<br>
       try {<br>
           try {<br>
               while (count == 0)<br>
                   notEmpty.await();<br>
           } catch (InterruptedException ie) {<br>
               notEmpty.signal(); // propagate to non-interrupted thread<br>
               throw ie;<br>
           }<br>
           E x = extract();<br>
           return x;<br>
       } finally {<br>
           lock.unlock();<br>
       }<br>
   }<br>
<br>
In other words, it would /always/ send a signal on interrupt, even if it had not received one.<br>
<br>
In Java 7, this was taken away, so we now have:<br>
<br>
   public E take() throws InterruptedException {<br>
       final ReentrantLock lock = this.lock;<br>
       lock.lockInterruptibly();<br>
       try {<br>
           while (count == 0)<br>
               notEmpty.await();<br>
           return extract();<br>
       } finally {<br>
           lock.unlock();<br>
       }<br>
   }<br>
<br>
However, I could not find substantial differences between the await() methods of Java 6 and 7.  Does this mean that propagating of the signal was not necessary in Java 6 either?  According to Doug Lea's book section 3.2.4.2, it is necessary with wait/notify to propagate the signal if you get interrupted.  However, it looks like Condition.await() is coded to cater for this eventuality anyway.<br>

<br>
Regards<span class="HOEnZb"><font color="#888888"><br>
<br>
Heinz<br>
-- <br>
Dr Heinz M. Kabutz (PhD CompSci)<br>
Author of "The Java(tm) Specialists' Newsletter"<br>
Sun Java Champion<br>
IEEE Certified Software Development Professional<br>
<a href="http://www.javaspecialists.eu" target="_blank">http://www.javaspecialists.eu</a><br>
Tel: <a href="tel:%2B30%2069%2072%20850%20460" value="+306972850460" target="_blank">+30 69 72 850 460</a><br>
Skype: kabutz <br>
______________________________<u></u>_________________<br>
Concurrency-interest mailing list<br>
<a href="mailto:Concurrency-interest@cs.oswego.edu" target="_blank">Concurrency-interest@cs.<u></u>oswego.edu</a><br>
<a href="http://cs.oswego.edu/mailman/listinfo/concurrency-interest" target="_blank">http://cs.oswego.edu/mailman/<u></u>listinfo/concurrency-interest</a><br>
</font></span></blockquote></div><br></div>