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