`Scala` 2.12 的`ScriptEngine` 是线程安全的吗?
Is `ScriptEngine` of `Scala` 2.12 thread-safe?
Scala
的 ScriptEngine
是线程安全的吗?这是基于 Scala-2.12
的实现:
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)
}
如果 运行 并行,则以上操作失败。如果 运行 顺序运行,则运行良好。
根据 Adriaan Moors 的这条推文 confirmation,它不是线程安全的。
Scala
的 ScriptEngine
是线程安全的吗?这是基于 Scala-2.12
的实现:
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)
}
如果 运行 并行,则以上操作失败。如果 运行 顺序运行,则运行良好。
根据 Adriaan Moors 的这条推文 confirmation,它不是线程安全的。