@@ -159,24 +159,15 @@ public final boolean cancel(boolean mayInterruptIfRunning) {
159
159
helper = new UnsafeAtomicHelper ();
160
160
} catch (Exception | Error unsafeFailure ) { // sneaky checked exception
161
161
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.
166
163
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 ();
174
165
} catch (Exception // sneaky checked exception
175
166
| Error atomicReferenceFieldUpdaterFailure ) {
176
167
// Some Android 5.0.x Samsung devices have bugs in JDK reflection APIs that cause
177
168
// 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.
180
171
thrownAtomicReferenceFieldUpdaterFailure = atomicReferenceFieldUpdaterFailure ;
181
172
helper = new SynchronizedHelper ();
182
173
}
@@ -716,7 +707,7 @@ mayInterruptIfRunning, new CancellationException("Future.cancel() was called."))
716
707
*
717
708
* <p>The default implementation does nothing.
718
709
*
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
720
711
* {@link #wasInterrupted} to decide whether to interrupt your task.
721
712
*
722
713
* @since 10.0
@@ -1447,24 +1438,16 @@ boolean casValue(AbstractFuture<?> future, @Nullable Object expect, Object updat
1447
1438
1448
1439
/** {@link AtomicHelper} based on {@link AtomicReferenceFieldUpdater}. */
1449
1440
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 ();
1468
1451
1469
1452
@ Override
1470
1453
void putThread (Waiter waiter , Thread newValue ) {
@@ -1502,6 +1485,24 @@ boolean casValue(AbstractFuture<?> future, @Nullable Object expect, Object updat
1502
1485
}
1503
1486
}
1504
1487
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
+
1505
1506
/**
1506
1507
* {@link AtomicHelper} based on {@code synchronized} and volatile writes.
1507
1508
*
0 commit comments