我将在 Struts2 范围之外重用 OGNL 库。我有相当大的公式集,这就是为什么我想预编译所有公式:
Ognl.parseExpression(expressionString);
但是我不确定预编译表达式是否可以在多线程环境中使用。有谁知道可以用吗?
这个PropertyUtils OGNL 的代码被编写为线程安全的,因此我猜测编译的表达式应该是线程安全的。
进一步的证据是,大多数访问器 API 都提供可变状态作为上下文参数(例如,参见 PropertyAccessor ),因此类本身几乎没有可变状态。不可变类本质上是线程安全的。开发者指南敦促扩展是线程安全的,最后查看代码,其中存在可变状态的地方,它被保护在同步块(synchronized block)中,例如参见 EvaluationPool .
总而言之,OGNL 似乎被设计为线程安全的。是否真的是另一个问题!您可以编写一个快速测试来确定,例如使用 Concutest 。或者,如果线程数量合理,则将所有表达式存储在 ThreadLocal 中可以完全回避该问题,但会花费一点额外的内存(也可能不会,因为 OGNL 会进行表达式缓存。)
我是一名优秀的程序员,十分优秀!