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;
+ }
}
}