src/share/classes/java/util/concurrent/Exchanger.java

Print this page

        

*** 277,286 **** --- 277,287 ---- * opportunistically subclasses AtomicReference to represent the * hole. So get() returns hole, and compareAndSet CAS'es value * into hole. This class cannot be parameterized as "V" because * of the use of non-V CANCEL sentinels. */ + @SuppressWarnings("serial") private static final class Node extends AtomicReference<Object> { /** The element offered by the Thread creating this node. */ public final Object item; /** The Thread waiting to be signalled; null until waiting. */
*** 301,310 **** --- 302,312 ---- * padding adds noticeable space, all slots are created only on * demand, and there will be more than one of them only when it * would improve throughput more than enough to outweigh using * extra space. */ + @SuppressWarnings("serial") private static final class Slot extends AtomicReference<Object> { // Improve likelihood of isolation on <= 64 byte cache lines long q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe; }
*** 614,630 **** * @param x the object to exchange * @return the object provided by the other thread * @throws InterruptedException if the current thread was * interrupted while waiting */ public V exchange(V x) throws InterruptedException { if (!Thread.interrupted()) { ! Object v = doExchange((x == null) ? NULL_ITEM : x, false, 0); ! if (v == NULL_ITEM) return null; ! if (v != CANCEL) ! return (V)v; Thread.interrupted(); // Clear interrupt status on IE throw } throw new InterruptedException(); } --- 616,633 ---- * @param x the object to exchange * @return the object provided by the other thread * @throws InterruptedException if the current thread was * interrupted while waiting */ + @SuppressWarnings("unchecked") public V exchange(V x) throws InterruptedException { if (!Thread.interrupted()) { ! Object o = doExchange((x == null) ? NULL_ITEM : x, false, 0); ! if (o == NULL_ITEM) return null; ! if (o != CANCEL) ! return (V)o; Thread.interrupted(); // Clear interrupt status on IE throw } throw new InterruptedException(); }
*** 668,686 **** * @throws InterruptedException if the current thread was * interrupted while waiting * @throws TimeoutException if the specified waiting time elapses * before another thread enters the exchange */ public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException { if (!Thread.interrupted()) { ! Object v = doExchange((x == null) ? NULL_ITEM : x, true, unit.toNanos(timeout)); ! if (v == NULL_ITEM) return null; ! if (v != CANCEL) ! return (V)v; if (!Thread.interrupted()) throw new TimeoutException(); } throw new InterruptedException(); } --- 671,690 ---- * @throws InterruptedException if the current thread was * interrupted while waiting * @throws TimeoutException if the specified waiting time elapses * before another thread enters the exchange */ + @SuppressWarnings("unchecked") public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException { if (!Thread.interrupted()) { ! Object o = doExchange((x == null) ? NULL_ITEM : x, true, unit.toNanos(timeout)); ! if (o == NULL_ITEM) return null; ! if (o != CANCEL) ! return (V)o; if (!Thread.interrupted()) throw new TimeoutException(); } throw new InterruptedException(); }