2008-03-22
Rhino JavaScript---Scope与Context的含义
1、Contexts
用来存储线程特定的相关信息,也就是执行环境。
每个线程有且只有一个Context,用来执行javascript。
Context为了关联当前线程,用
Context cx = Context.enter();
javascript执行之后,用
Context.exit();
来退出。而且必须放在finally块中。
enter/exit是基于引用计数的,每引用一次,则计数器加1,当计数器为0,则取消与当前线程的关联。
2、Scopes
Scope是javascript对象的集合。
执行javascript要求一个scope,用来存储顶层的脚本变量。也是找标准对象的地方。
Scope是独立于Context的。
你可以同时的在多线程中执行同一个scope。
你可以在一个context中创建scope,然后你可以在另一个context中执行该scope的脚本。
Rhina保证访问javascript对象的属性是原子的。但不保证同时的使用相同的scope执行脚本。
如果两个脚本同时的使用相同的scope,脚本要复杂协调共享变量。
也就是说读是原子的,写就不是。
顶层scope(top-level scope)用Context.initStandardObjects来创建所有标准对象:
ScriptableObject scope = cx.initStandardObjects();
最方便的方法就是你需要scope的时候使用上面的方法来创建scope。
但是initStandardObjects方法是非常昂贵的,它需要分配大量内存。
下面说明怎么在多线程和多scope中共享scope。
用来存储线程特定的相关信息,也就是执行环境。
每个线程有且只有一个Context,用来执行javascript。
Context为了关联当前线程,用
Context cx = Context.enter();
javascript执行之后,用
Context.exit();
来退出。而且必须放在finally块中。
enter/exit是基于引用计数的,每引用一次,则计数器加1,当计数器为0,则取消与当前线程的关联。
2、Scopes
Scope是javascript对象的集合。
执行javascript要求一个scope,用来存储顶层的脚本变量。也是找标准对象的地方。
Scope是独立于Context的。
你可以同时的在多线程中执行同一个scope。
你可以在一个context中创建scope,然后你可以在另一个context中执行该scope的脚本。
Rhina保证访问javascript对象的属性是原子的。但不保证同时的使用相同的scope执行脚本。
如果两个脚本同时的使用相同的scope,脚本要复杂协调共享变量。
也就是说读是原子的,写就不是。
顶层scope(top-level scope)用Context.initStandardObjects来创建所有标准对象:
ScriptableObject scope = cx.initStandardObjects();
最方便的方法就是你需要scope的时候使用上面的方法来创建scope。
但是initStandardObjects方法是非常昂贵的,它需要分配大量内存。
下面说明怎么在多线程和多scope中共享scope。


评论