I was bitten by the issue described in https://stackoverflow.com/a/31052486/6253347 \[cpovirk adds (for searchability): might https://stackoverflow.com/q/55333290/28465 also be similar?\] when trying to use Arrow Flight with Java's SecurityManager, since `AbstractFuture` tries to check a property as part of initialization and hence can't be created from an `InnocuousThread` that doesn't have any privileges. The exception looks like this:

```
Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "guava.concurrent.generate_cancellation_cause" "read")
	at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
	at java.base/java.security.AccessController.checkPermission(AccessController.java:1044)
	at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:408)
	at java.base/java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1152)
	at java.base/java.lang.System.getProperty(System.java:880)
	at com.google.common.util.concurrent.AbstractFuture.<clinit>(AbstractFuture.java:64)
```

I can try to put together a small repro if it's useful, but the TL;DR is that I'd like to wrap the call at https://github.com/google/guava/blob/master/guava/src/com/google/common/util/concurrent/AbstractFuture.java#L74 in a try/catch, since it will throw if access to system properties is not permitted by the SecurityManager.
final Object localValue = value;
    return localValue instanceof Cancellation;
  }
  /**
   * {@inheritDoc}
   *
   * <p>If a cancellation attempt succeeds on a {@code Future} that had previously been {@linkplain
   * #setFuture set asynchronously}, then the cancellation will also be propagated to the delegate
   * {@code Future} that was supplied in the {@code setFuture} call.
   *
   * <p>Rather than override this method to perform additional cancellation work or cleanup,
   * subclasses should override {@link #afterDone}, consulting {@link #isCancelled} and {@link
   * #wasInterrupted} as necessary. This ensures that the work is done even if the future is
   * cancelled without a call to {@code cancel}, such as by calling {@code
   * setFuture(cancelledFuture)}.
   */
  @CanIgnoreReturnValue
  @Override
  public boolean cancel(boolean mayInterruptIfRunning) {
    Object localValue = value;
    boolean rValue = false;
    if (localValue == null | localValue instanceof SetFuture) {
      
      
      Object valueToSet =
          GENERATE_CANCELLATION_CAUSES
              ? new Cancellation(
                  mayInterruptIfRunning, new CancellationException("Future.cancel() was called."))
              : (mayInterruptIfRunning
                  ? Cancellation.CAUSELESS_INTERRUPTED