diff --git a/src/main/java/org/mvel2/MVELRuntime.java b/src/main/java/org/mvel2/MVELRuntime.java index 43d7eed4c..05a6d305c 100644 --- a/src/main/java/org/mvel2/MVELRuntime.java +++ b/src/main/java/org/mvel2/MVELRuntime.java @@ -24,6 +24,7 @@ import org.mvel2.debug.Debugger; import org.mvel2.debug.DebuggerContext; import org.mvel2.integration.VariableResolverFactory; +import org.mvel2.optimizers.OptimizerFactory; import org.mvel2.util.ErrorUtil; import org.mvel2.util.ExecutionStack; @@ -164,6 +165,9 @@ else if (stk.isEmpty()) { throw e; } } + finally { + OptimizerFactory.clearThreadAccessorOptimizer(); + } } /** diff --git a/src/main/java/org/mvel2/optimizers/OptimizerFactory.java b/src/main/java/org/mvel2/optimizers/OptimizerFactory.java index d71fe372f..1604f34b9 100644 --- a/src/main/java/org/mvel2/optimizers/OptimizerFactory.java +++ b/src/main/java/org/mvel2/optimizers/OptimizerFactory.java @@ -101,7 +101,9 @@ public static void setDefaultOptimizer(String name) { //noinspection unchecked AccessorOptimizer ao = accessorCompilers.get(defaultOptimizer = name); ao.init(); - setThreadAccessorOptimizer(ao.getClass()); + //clear optimizer so next call to getThreadAccessorOptimizer uses the default again, don't set thread optimizer + //or else static initializers setting the default will unintentionally set up ThreadLocals + threadOptimizer.set(null); } catch (Exception e) { throw new RuntimeException("unable to instantiate accessor compiler", e);