package org.mvel2.tests.core; import org.mvel2.MVEL; import org.mvel2.optimizers.OptimizerFactory; import java.io.Serializable; public class MVELThreadTest { public static void main(String[] args) { MVELThreadTest threadTest = new MVELThreadTest(); threadTest.start(); } public void start() { //Create two of the same expressions final String expression = "firstname"; final String expression2 = "lastname"; //Create a bean to run expressions against final Bean bean = new Bean(); //Use reflection mode OptimizerFactory.setDefaultOptimizer(OptimizerFactory.SAFE_REFLECTIVE); //Compile the expressions Serializable mvelExp1 = MVEL.compileExpression(expression); Serializable mvelExp2 = MVEL.compileExpression(expression2); //run the threads runThreads(bean, mvelExp1, mvelExp2); } public void runThreads(final Bean bean, final Serializable mvelExpr1, final Serializable mvelExpr2) { //Start 5 threads, each executing the specified MVEL expressions for (int i = 0; i < 5; i++) { Thread t = new Thread() { public void run() { testMvel(bean, mvelExpr1, mvelExpr2); } }; t.start(); } } //by synchronizing the testMvel method, the exception does not occur public void testMvel(Bean bean, Serializable mvelExpr1, Serializable mvelExpr2) { int iterations = 100; for (int i = 0; i < iterations; i++) { MVEL.executeExpression(mvelExpr1, bean); MVEL.executeExpression(mvelExpr2, bean); } } /** * Bean */ public static class Bean { private String firstname; private String lastname; public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } } }