corrected lock order & cached precompiled script class instance
diff --git a/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptFinder.java b/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptFinder.java
index 77f917a..49a1e33 100644
--- a/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptFinder.java
+++ b/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptFinder.java
@@ -71,7 +71,7 @@
                     if (bundledScriptURL != null) {
                         try {
                             return new PrecompiledScript(scriptEngineManager.getEngineByExtension(extension),
-                                    bundle.loadClass(fromClassResourceToClassname(classResource)));
+                                    bundle.loadClass(fromClassResourceToClassname(classResource)).getDeclaredConstructor().newInstance());
                         } catch (Exception e) {
                             throw new RuntimeException(e);
                         }
diff --git a/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptServlet.java b/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptServlet.java
index 3d3714a..c3cbf76 100644
--- a/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptServlet.java
+++ b/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptServlet.java
@@ -88,14 +88,15 @@
             }
 
             String scriptsMapKey = getScriptsMapKey(request);
-            ScriptEngineExecutable script = scriptsMap.get(scriptsMapKey);
+            ScriptEngineExecutable script;
             lock.readLock().lock();
             try {
+                script = scriptsMap.get(scriptsMapKey);
                 if (script == null) {
                     lock.readLock().unlock();
                     lock.writeLock().lock();
                     try {
-                        script = scriptsMap.get(getScriptsMapKey(request));
+                        script = scriptsMap.get(scriptsMapKey);
                         if (script == null) {
                             if (StringUtils.isEmpty(m_delegatedResourceType)) {
                                 script = m_bundledScriptFinder.getScript(request, m_bundle, precompiledScripts);
@@ -106,8 +107,8 @@
                                 scriptsMap.put(scriptsMapKey, script);
                             }
                         }
-                    } finally {
                         lock.readLock().lock();
+                    } finally {
                         lock.writeLock().unlock();
                     }
                 }
diff --git a/src/main/java/org/apache/sling/scripting/resolver/internal/PrecompiledScript.java b/src/main/java/org/apache/sling/scripting/resolver/internal/PrecompiledScript.java
index 84bb5c1..8e65f4c 100644
--- a/src/main/java/org/apache/sling/scripting/resolver/internal/PrecompiledScript.java
+++ b/src/main/java/org/apache/sling/scripting/resolver/internal/PrecompiledScript.java
@@ -30,16 +30,16 @@
 public class PrecompiledScript implements ScriptEngineExecutable {
 
     private ScriptEngine scriptEngine;
-    private Class precompiledScript;
+    private Object precompiledScript;
 
-    PrecompiledScript(ScriptEngine scriptEngine, Class precompiledScript) {
+    PrecompiledScript(ScriptEngine scriptEngine, Object precompiledScript) {
         this.scriptEngine = scriptEngine;
         this.precompiledScript = precompiledScript;
     }
 
     @Override
     public String getName() {
-        return precompiledScript.getName();
+        return precompiledScript.getClass().getName();
     }
 
     @Override
diff --git a/src/main/java/org/apache/sling/scripting/resolver/internal/Script.java b/src/main/java/org/apache/sling/scripting/resolver/internal/Script.java
index bbefc16..24c5357 100644
--- a/src/main/java/org/apache/sling/scripting/resolver/internal/Script.java
+++ b/src/main/java/org/apache/sling/scripting/resolver/internal/Script.java
@@ -40,16 +40,25 @@
     private ScriptEngine scriptEngine;
     private String sourceCode;
     private CompiledScript compiledScript = null;
-    private Lock lock = new ReentrantLock();
+    private Lock compilationLock = new ReentrantLock();
+    private Lock readLock = new ReentrantLock();
+
 
     Script(URL url, ScriptEngine scriptEngine) {
         this.url = url;
         this.scriptEngine = scriptEngine;
     }
 
-    private synchronized String getSourceCode() throws IOException {
+    private String getSourceCode() throws IOException {
         if (sourceCode == null) {
-            sourceCode = IOUtils.toString(url.openStream(), StandardCharsets.UTF_8);
+            readLock.lock();
+            try {
+                if (sourceCode == null) {
+                    sourceCode = IOUtils.toString(url.openStream(), StandardCharsets.UTF_8);
+                }
+            } finally {
+                readLock.unlock();
+            }
         }
         return sourceCode;
     }
@@ -65,7 +74,7 @@
     public void eval(ScriptContext context) throws ScriptException {
         try {
             if (scriptEngine instanceof Compilable && compiledScript == null) {
-                lock.lock();
+                compilationLock.lock();
                 try {
                     if (scriptEngine instanceof Compilable && compiledScript == null) {
                         compiledScript =
@@ -73,7 +82,7 @@
                                         .compile(new ScriptNameAwareReader(new StringReader(getSourceCode()), getName()));
                     }
                 } finally {
-                    lock.unlock();
+                    compilationLock.unlock();
                 }
             }
             if (compiledScript != null) {