@@ -159,24 +159,15 @@ public final boolean cancel(boolean mayInterruptIfRunning) {
159159 helper = new UnsafeAtomicHelper ();
160160 } catch (Exception | Error unsafeFailure ) { // sneaky checked exception
161161 thrownUnsafeFailure = unsafeFailure ;
162- // catch absolutely everything and fall through to our
163- // 'AtomicReferenceFieldUpdaterAtomicHelper' The access control checks that ARFU does means
164- // the caller class has to be AbstractFuture instead of
165- // AtomicReferenceFieldUpdaterAtomicHelper, so we annoyingly define these here
162+ // Catch absolutely everything and fall through to AtomicReferenceFieldUpdaterAtomicHelper.
166163 try {
167- helper =
168- new AtomicReferenceFieldUpdaterAtomicHelper (
169- newUpdater (Waiter .class , Thread .class , "thread" ),
170- newUpdater (Waiter .class , Waiter .class , "next" ),
171- newUpdater (AbstractFuture .class , Waiter .class , "waiters" ),
172- newUpdater (AbstractFuture .class , Listener .class , "listeners" ),
173- newUpdater (AbstractFuture .class , Object .class , "value" ));
164+ helper = new AtomicReferenceFieldUpdaterAtomicHelper ();
174165 } catch (Exception // sneaky checked exception
175166 | Error atomicReferenceFieldUpdaterFailure ) {
176167 // Some Android 5.0.x Samsung devices have bugs in JDK reflection APIs that cause
177168 // getDeclaredField to throw a NoSuchFieldException when the field is definitely there.
178- // For these users fallback to a suboptimal implementation, based on synchronized. This will
179- // be a definite performance hit to those users.
169+ // For these users fallback to a suboptimal implementation, based on synchronized. This
170+ // will be a definite performance hit to those users.
180171 thrownAtomicReferenceFieldUpdaterFailure = atomicReferenceFieldUpdaterFailure ;
181172 helper = new SynchronizedHelper ();
182173 }
@@ -716,7 +707,7 @@ mayInterruptIfRunning, new CancellationException("Future.cancel() was called."))
716707 *
717708 * <p>The default implementation does nothing.
718709 *
719- * <p>This method is likely to be deprecated. Prefer to override {@link #afterDone}, consulting
710+ * <p>This method is likely to be deprecated. Prefer to override {@link #afterDone}, checking
720711 * {@link #wasInterrupted} to decide whether to interrupt your task.
721712 *
722713 * @since 10.0
@@ -1447,24 +1438,16 @@ boolean casValue(AbstractFuture<?> future, @Nullable Object expect, Object updat
14471438
14481439 /** {@link AtomicHelper} based on {@link AtomicReferenceFieldUpdater}. */
14491440 private static final class AtomicReferenceFieldUpdaterAtomicHelper extends AtomicHelper {
1450- final AtomicReferenceFieldUpdater <Waiter , Thread > waiterThreadUpdater ;
1451- final AtomicReferenceFieldUpdater <Waiter , Waiter > waiterNextUpdater ;
1452- final AtomicReferenceFieldUpdater <? super AbstractFuture <?>, Waiter > waitersUpdater ;
1453- final AtomicReferenceFieldUpdater <? super AbstractFuture <?>, Listener > listenersUpdater ;
1454- final AtomicReferenceFieldUpdater <? super AbstractFuture <?>, Object > valueUpdater ;
1455-
1456- AtomicReferenceFieldUpdaterAtomicHelper (
1457- AtomicReferenceFieldUpdater <Waiter , Thread > waiterThreadUpdater ,
1458- AtomicReferenceFieldUpdater <Waiter , Waiter > waiterNextUpdater ,
1459- AtomicReferenceFieldUpdater <? super AbstractFuture <?>, Waiter > waitersUpdater ,
1460- AtomicReferenceFieldUpdater <? super AbstractFuture <?>, Listener > listenersUpdater ,
1461- AtomicReferenceFieldUpdater <? super AbstractFuture <?>, Object > valueUpdater ) {
1462- this .waiterThreadUpdater = waiterThreadUpdater ;
1463- this .waiterNextUpdater = waiterNextUpdater ;
1464- this .waitersUpdater = waitersUpdater ;
1465- this .listenersUpdater = listenersUpdater ;
1466- this .valueUpdater = valueUpdater ;
1467- }
1441+ private static final AtomicReferenceFieldUpdater <Waiter , Thread > waiterThreadUpdater =
1442+ newUpdater (Waiter .class , Thread .class , "thread" );
1443+ private static final AtomicReferenceFieldUpdater <Waiter , Waiter > waiterNextUpdater =
1444+ newUpdater (Waiter .class , Waiter .class , "next" );
1445+ private static final AtomicReferenceFieldUpdater <? super AbstractFuture <?>, Waiter >
1446+ waitersUpdater = waitersUpdaterFromWithinAbstractFuture ();
1447+ private static final AtomicReferenceFieldUpdater <? super AbstractFuture <?>, Listener >
1448+ listenersUpdater = listenersUpdaterFromWithinAbstractFuture ();
1449+ private static final AtomicReferenceFieldUpdater <? super AbstractFuture <?>, Object >
1450+ valueUpdater = valueUpdaterFromWithinAbstractFuture ();
14681451
14691452 @ Override
14701453 void putThread (Waiter waiter , Thread newValue ) {
@@ -1502,6 +1485,24 @@ boolean casValue(AbstractFuture<?> future, @Nullable Object expect, Object updat
15021485 }
15031486 }
15041487
1488+ /** Returns an {@link AtomicReferenceFieldUpdater} for {@link #waiters}. */
1489+ private static AtomicReferenceFieldUpdater <? super AbstractFuture <?>, Waiter >
1490+ waitersUpdaterFromWithinAbstractFuture () {
1491+ return newUpdater (AbstractFuture .class , Waiter .class , "waiters" );
1492+ }
1493+
1494+ /** Returns an {@link AtomicReferenceFieldUpdater} for {@link #listeners}. */
1495+ private static AtomicReferenceFieldUpdater <? super AbstractFuture <?>, Listener >
1496+ listenersUpdaterFromWithinAbstractFuture () {
1497+ return newUpdater (AbstractFuture .class , Listener .class , "listeners" );
1498+ }
1499+
1500+ /** Returns an {@link AtomicReferenceFieldUpdater} for {@link #value}. */
1501+ private static AtomicReferenceFieldUpdater <? super AbstractFuture <?>, Object >
1502+ valueUpdaterFromWithinAbstractFuture () {
1503+ return newUpdater (AbstractFuture .class , Object .class , "value" );
1504+ }
1505+
15051506 /**
15061507 * {@link AtomicHelper} based on {@code synchronized} and volatile writes.
15071508 *
0 commit comments