Безопасность нитей OGNL - PullRequest
       8

Безопасность нитей OGNL

1 голос
/ 30 апреля 2010

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

Ognl.parseExpression(expressionString);

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

Ответы [ 2 ]

1 голос
/ 07 мая 2010

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

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

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

0 голосов
/ 05 мая 2010

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

Проект, похоже, заброшен на какое-то время, так что вряд ли найдется кто-нибудь, кто знает: /

...