11
22package org .scijava .legacy .service ;
33
4- import org .scijava .app .StatusService ;
54import org .scijava .ops .api .OpEnvironment ;
65import org .scijava .plugin .Attr ;
76import org .scijava .plugin .Parameter ;
1413import org .scijava .service .Service ;
1514import org .scijava .task .TaskService ;
1615
17- import java .io .ObjectInputFilter ;
1816import java .util .Map ;
1917import java .util .WeakHashMap ;
2018
@@ -34,13 +32,8 @@ public class DefaultOpEnvironmentService extends AbstractService implements
3432 @ Parameter (required = false )
3533 private TaskService taskService ;
3634
37- private OpEnvironment env ;
38-
3935 @ Override
4036 public void initialize () {
41- // Build the Op Environment
42- env = OpEnvironment .build ();
43-
4437 // Set up alias, if ScriptService available
4538 if (scriptService != null ) {
4639 scriptService .addAlias (OpEnvironment .class );
@@ -52,10 +45,10 @@ public void initialize() {
5245 }
5346 }
5447
55- private class SciJavaProgressListener implements ProgressListener {
48+ private static class SciJavaProgressListener implements ProgressListener {
5649
5750 private final Map <Task , org .scijava .task .Task > taskMap ;
58- private TaskService tasks ;
51+ private final TaskService tasks ;
5952
6053 public SciJavaProgressListener (TaskService tasks ) {
6154 this .tasks = tasks ;
@@ -79,8 +72,22 @@ public void acknowledgeUpdate(Task task) {
7972 }
8073 }
8174
75+ /**
76+ * A class that lazily loads a static {@link OpEnvironment} using the <a
77+ * href=https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom>Initialization-on-demand
78+ * holder idiom</a>. This solution provides high concurrency, ensuring the
79+ * {@link OpEnvironment} is only constructed once.
80+ *
81+ * @author Gabriel Selzer
82+ */
83+ private static class OpEnvironmentHolder {
84+
85+ public static final OpEnvironment env = OpEnvironment .build ();
86+ }
87+
8288 @ Override
8389 public OpEnvironment env () {
84- return env ;
90+ return OpEnvironmentHolder . env ;
8591 }
92+
8693}
0 commit comments