我将在 Struts2 范围之外重用 OGNL 库。我有相当多的公式,这就是为什么我想预编译所有公式:
Ognl.parseExpression(expressionString);
但是我不确定预编译表达式是否可以在多线程环境中使用。有人知道它是否可以使用吗?
我将在 Struts2 范围之外重用 OGNL 库。我有相当多的公式,这就是为什么我想预编译所有公式:
Ognl.parseExpression(expressionString);
但是我不确定预编译表达式是否可以在多线程环境中使用。有人知道它是否可以使用吗?
这个来自 OGNL 的PropertyUtils代码被编写为线程安全的,所以我猜想编译的表达式应该是线程安全的。
进一步的证据是大多数访问器 API 提供可变状态作为上下文参数(例如,请参阅PropertyAccessor),因此类本身几乎没有可变状态。不可变类本质上是线程安全的。开发人员指南敦促扩展是线程安全的,最后查看代码,其中存在可变状态,它被保护在一个同步块中,例如参见EvaluationPool。
总之,OGNL 似乎被设计为线程安全的。是不是真的是另一个问题!您可以编写一个快速测试来确定,例如使用Concutest。或者,如果线程数是合理的,将所有表达式存储在 ThreadLocal 中可以完全回避这个问题,代价是需要一点额外的内存(或者可能不会,因为 OGNL 执行表达式缓存。)
我认为您最好的选择是直接或通过邮件列表联系原始开发人员:
http ://www.opensymphony.com/ognl/members.action
https://ognl.dev.java.net/servlets/ProjectMailingListList
该项目似乎被放弃了一段时间,所以几乎没有其他人知道:/