多线程 Nashorn: o.constructor === o.constructor 给出 false

Multi-threaded Nashorn: o.constructor === o.constructor gives false

本文关键字:constructor false 给出 Nashorn 多线程      更新时间:2023-09-26

我正在 Nashorn 中尝试多线程脚本加载和评估,并得到了令人震惊的行为:

// having some object o loaded in another thread
print(o.constructor === o.constructor); // false
print(o.constructor === Object); // false as well
print(o.foo === o.foo); // true - OK

这在单个脚本引擎中如何实现? 上面的o只是一个使用对象文字表示法(在另一个线程中)创建的对象。打印o.constructor通常function Object() { [native code] };

同时:

print({}.constructor === {}.constructor); // true

有什么想法吗?

更新

事实证明,这与多线程完全无关。有关详细信息,请参阅下面的回答。

事实证明,这与多线程完全无关。这是一个简单的Scala程序,它重现了这个问题:

object Test extends App {
  val engine = new ScriptEngineManager().getEngineByName("nashorn")
  var o = engine.eval("({ foo: 'bar' })")
  var result = engine.eval("(o.constructor === o.constructor)", new SimpleBindings() {
    put("o", o)
  })
  print(result) // false
}

我错误地使用了bindings参数。相反,我应该采用现有bindings并就地更新它们。我仍然不相信这应该导致o.constructor === o.constructor是错误的,但至少它现在有效。更正版本:

object Test extends App {
  val engine = new ScriptEngineManager().getEngineByName("nashorn")
  var o = engine.eval("({ foo: 'bar' })")
  val bindings =  engine.getBindings(ScriptContext.ENGINE_SCOPE)
  bindings.put("o", o)
  var result = engine.eval("(o.constructor === o.constructor)", bindings)
  print(result) // true
}