2010-04-30 2 views
1

Я собираюсь повторно использовать библиотеку OGNL из области Struts2. У меня есть довольно большой набор формул, поэтому я хотел бы перекомпилировать все из них:Безопасность потока OGNL

Ognl.parseExpression(expressionString); 

Но я не уверен, что если прекомпилировано выражение может быть использован в среде многопоточной. Кто-нибудь знает, можно ли его использовать?

ответ

1

Этот код PropertyUtils от OGNL написан как потокобезопасный, и поэтому я бы предположил, что скомпилированные выражения предназначены для потокобезопасности.

Другие доказательства того, что большинство API-интерфейса доступа предоставляют изменяемое состояние в качестве параметра контекста (например, см. PropertyAccessor), поэтому сами классы имеют мало изменяемое состояние. Неизменяемые классы неотъемлемо потокобезопасны. Руководство разработчика настоятельно призывает расширения быть потокобезопасными и, наконец, , просматривая код, где есть изменяемое состояние, он охраняется в синхронизированном блоке, например, см. EvaluationPool.

Таким образом, кажется, что OGNL был спроектирован так, чтобы быть потокобезопасным. На самом деле это или нет, это другой вопрос! Вы можете написать быстрый тест, чтобы убедиться наверняка, используя, например, Concutest. В качестве альтернативы, если количество потоков является разумным, сохранение всех выражений в ThreadLocal оборачивает проблему в целом за счет небольшой дополнительной памяти (или, возможно, нет, поскольку OGNL делает кеширование экспрессии.)

0

Я думаю, что лучшим вариантом является, чтобы связаться оригинальных разработчиков, напрямую или через список рассылки:
http://www.opensymphony.com/ognl/members.action
https://ognl.dev.java.net/servlets/ProjectMailingListList

Проект, кажется, отказаться на некоторое время, так что вряд ли кто-то еще, кто знает:/

 Смежные вопросы

  • Нет связанных вопросов^_^