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