diff --git a/jena-core/src/main/java/org/apache/jena/sys/JenaSystem.java b/jena-core/src/main/java/org/apache/jena/sys/JenaSystem.java
index 09871f83b96..c9a0b8038e2 100644
--- a/jena-core/src/main/java/org/apache/jena/sys/JenaSystem.java
+++ b/jena-core/src/main/java/org/apache/jena/sys/JenaSystem.java
@@ -78,22 +78,34 @@ public static void logLifecycle(String fmt, Object ...args) {
public static void init() {
// Once jena is initialized, all calls are an immediate return.
- if ( initialized )
- return ;
- // Overlapping attempts to perform initialization will block on the synchronized.
- synchronized(JenaSystem.class) {
- if ( initialized )
- return ;
+ if(initialized) {
+ return;
+ }
+
+ // Access the initialized flag to trigger class loading
+ initialized = LazyHolder.IS_INITIALIZED;
+ }
+
+ /**
+ * Initialization-on-demand holder idiom
+ * @see Initialization-on-demand holder idiom
+ *
+ */
+ private static class LazyHolder {
+ public static final boolean IS_INITIALIZED = initialize();
+
+ private static boolean initialize() {
+ initialized = true; // Set early to avoid blocking on static initialization.
setup();
if ( DEBUG_INIT )
singleton.debug(DEBUG_INIT);
singleton.initialize();
singleton.debug(false);
- // Last so overlapping initialization waits on the synchronized
- initialized = true;
+ return true;
}
}
+
public static void shutdown() { singleton.shutdown(); }
/** The level 0 subsystem - inserted without using the Registry load function.
diff --git a/jena-integration-tests/pom.xml b/jena-integration-tests/pom.xml
index 5152e1b7cb0..55c654158a7 100644
--- a/jena-integration-tests/pom.xml
+++ b/jena-integration-tests/pom.xml
@@ -152,6 +152,18 @@
test
+
+ org.openjdk.jmh
+ jmh-core
+ test
+
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ test
+
+
@@ -186,6 +198,11 @@
org.apache.maven.plugins
maven-compiler-plugin
+
+
+ -proc:full
+
+
diff --git a/jena-integration-tests/src/test/java/org/apache/jena/sys/TS_Sys.java b/jena-integration-tests/src/test/java/org/apache/jena/sys/TS_Sys.java
new file mode 100644
index 00000000000..ce21341f10e
--- /dev/null
+++ b/jena-integration-tests/src/test/java/org/apache/jena/sys/TS_Sys.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.sys;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses(
+ { TestJenaSystem.class
+ , TestJenaSystemWithFreshJVM.class
+ })
+
+public class TS_Sys { }
diff --git a/jena-integration-tests/src/test/java/org/apache/jena/sys/TestJenaSystem.java b/jena-integration-tests/src/test/java/org/apache/jena/sys/TestJenaSystem.java
new file mode 100644
index 00000000000..1dc82bfbc2e
--- /dev/null
+++ b/jena-integration-tests/src/test/java/org/apache/jena/sys/TestJenaSystem.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jena.sys;
+
+import org.apache.jena.rdf.model.ModelFactory;
+import org.junit.Test;
+
+
+import java.time.Duration;
+import java.time.temporal.ChronoUnit;
+import java.util.HashSet;
+import java.util.concurrent.Executors;
+import java.util.stream.IntStream;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class TestJenaSystem {
+
+ /**
+ * Test that the first initialization of JenaSystem is successful.
+ * This code was able to reproduce a deadlock for