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.
static final sun.misc.Unsafe UNSAFE;
    static final long LISTENERS_OFFSET;
    static final long WAITERS_OFFSET;
    static final long VALUE_OFFSET;
    static final long WAITER_THREAD_OFFSET;
    static final long WAITER_NEXT_OFFSET;
    static {
      sun.misc.Unsafe unsafe = null;
      try {
        unsafe = sun.misc.Unsafe.getUnsafe();
      } catch (SecurityException tryReflectionInstead) {
        try {
          unsafe =
              AccessController.doPrivileged(
                  new PrivilegedExceptionAction<sun.misc.Unsafe>() {
                    @Override
                    public sun.misc.Unsafe run() throws Exception {
                      Class<sun.misc.Unsafe> k = sun.misc.Unsafe.class;
                      for (java.lang.reflect.Field f : k.getDeclaredFields()) {
                        f.setAccessible(true);
                        Object x = f.get(null);
                        if (k.isInstance(x)) {
                          return k.cast(x);
                        }
                      }
                      throw new NoSuchFieldError("the Unsafe");