Possible race condition ServerImpl between start() and shutdown()
I believe it may be possible if start and stop are called concurrently that the shared executor may not get released.  I'm not sure if this is an actual problem, but it does go against the @ ThreadSafe annotation.

diff --git a/core/src/main/java/io/grpc/internal/ServerImpl.java b/core/src/main/java/io/grpc/internal/ServerImpl.java
index 80523832f..e45a6cecb 100644
--- a/core/src/main/java/io/grpc/internal/ServerImpl.java
+++ b/core/src/main/java/io/grpc/internal/ServerImpl.java
@@ -31,6 +31,7 @@
 
 package io.grpc.internal;
 
+import static com.google.common.base.Preconditions.checkState;
 import static io.grpc.internal.GrpcUtil.TIMEOUT_KEY;
 import static io.grpc.internal.GrpcUtil.TIMER_SERVICE;
 
@@ -114,9 +115,8 @@ public final class ServerImpl extends io.grpc.Server {
   @Override
   public ServerImpl start() throws IOException {
     synchronized (lock) {
-      if (started) {
-        throw new IllegalStateException("Already started");
-      }
+      checkState(!started, "Already started");
+      checkState(!shutdown, "Shutting down");
       usingSharedExecutor = executor == null;
       if (usingSharedExecutor) {
         executor = SharedResourceHolder.get(GrpcUtil.SHARED_CHANNEL_EXECUTOR);
['core/src/main/java/io/grpc/internal/ServerImpl.java']