Search code examples
scalascriptengine

Is `ScriptEngine` of `Scala` 2.12 thread-safe?


Is ScriptEngine of Scala thread-safe? This is from Scala-2.12 based implementation:

import java.util.concurrent.Executors    
import javax.script._    
import scala.concurrent.duration._
import scala.concurrent.{Await, ExecutionContext, Future}

object Prac extends App {

  val scripter = new ScriptEngineManager().getEngineByName("scala")

  val exe = Executors.newFixedThreadPool(100)
  implicit val e = ExecutionContext.fromExecutor(exe)

  val ans = for {
    x <- 1 to 100
  } yield Future {
      val bindings = scripter.createBindings()
      bindings.put("x", x)
      val script = scripter.eval(
        """

      def sqrt(n:Int) = math.sqrt(n)

      sqrt(x.asInstanceOf[Int])

    """.stripMargin, bindings)
      require(script == math.sqrt(x))
      println(x+" - " + script)
  }
  Await.result(Future.sequence(ans), 20 seconds)

}

The above fails if run in parallel. Runs perfectly fine if run sequential.


Solution

  • As per this tweet confirmation by Adriaan Moors, it is not thread-safe.