Synchronize access to static executors

Change-Id: Iad743cfd22b7017b432f8fd6bdb3e13096a31da5
diff --git a/utils/misc/src/main/java/org/onlab/util/SharedScheduledExecutors.java b/utils/misc/src/main/java/org/onlab/util/SharedScheduledExecutors.java
index a85c5ff..cfba06d 100644
--- a/utils/misc/src/main/java/org/onlab/util/SharedScheduledExecutors.java
+++ b/utils/misc/src/main/java/org/onlab/util/SharedScheduledExecutors.java
@@ -36,8 +36,8 @@
 
     public static final int DEFAULT_POOL_SIZE = 30;
 
+    private static final Object EXECUTORS_LOCK = new Object();
     private static SharedScheduledExecutorService singleThreadExecutor = null;
-
     private static SharedScheduledExecutorService poolThreadExecutor = null;
 
     // Ban public construction
@@ -45,18 +45,20 @@
     }
 
     private static void setup() {
-        if (singleThreadExecutor == null) {
-            singleThreadExecutor =
-                new SharedScheduledExecutorService(
-                    newSingleThreadScheduledExecutor(
-                        groupedThreads("onos/shared/scheduled",
-                            "onos-single-executor")));
+        synchronized (EXECUTORS_LOCK) {
+            if (singleThreadExecutor == null) {
+                singleThreadExecutor =
+                    new SharedScheduledExecutorService(
+                        newSingleThreadScheduledExecutor(
+                            groupedThreads("onos/shared/scheduled",
+                                "onos-single-executor")));
 
-            poolThreadExecutor =
-                new SharedScheduledExecutorService(
-                    newScheduledThreadPool(DEFAULT_POOL_SIZE,
-                        groupedThreads("onos/shared/scheduled",
-                            "onos-pool-executor-%d")));
+                poolThreadExecutor =
+                    new SharedScheduledExecutorService(
+                        newScheduledThreadPool(DEFAULT_POOL_SIZE,
+                            groupedThreads("onos/shared/scheduled",
+                                "onos-pool-executor-%d")));
+            }
         }
     }
 
@@ -113,9 +115,11 @@
      * This is not intended to be called by application directly.
      */
     public static void shutdown() {
-        singleThreadExecutor.backingExecutor().shutdown();
-        singleThreadExecutor = null;
-        poolThreadExecutor.backingExecutor().shutdown();
-        poolThreadExecutor = null;
+        synchronized (EXECUTORS_LOCK) {
+            singleThreadExecutor.backingExecutor().shutdown();
+            singleThreadExecutor = null;
+            poolThreadExecutor.backingExecutor().shutdown();
+            poolThreadExecutor = null;
+        }
     }
 }