MVELThreadTest.java
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;
    }
  }
}