2010-04-30 37 views
1

我將從Struts2範圍中重用OGNL庫。我有相當大的一套公式,這就是爲什麼我想預編譯所有的人:OGNL線程安全

Ognl.parseExpression(expressionString); 

但我不知道,如果預編譯的表達可以在多線程環境中使用。有誰知道它是否可以使用?

回答

1

這個PropertyUtils來自OGNL的代碼被寫成線程安全的,所以我猜想編譯的表達式是爲了線程安全的。更進一步的證據是,大多數訪問者API提供了可變狀態作爲上下文參數(例如參見PropertyAccessor),所以這些類本身幾乎沒有可變狀態。不可變類是本質線程安全的。開發人員指南要求擴展是線程安全的,最後通過代碼查看哪裏存在可變狀態,並在同步塊中進行保護,例如參見EvaluationPool

總之,看起來OGNL的設計是線程安全的。不管它是否真的是另一個問題!你可以寫一個快速測試來確認,例如使用Concutest。或者,如果線程的數量合理,將所有表達式存儲在ThreadLocal中將完全避免該問題,但需要額外的一點內存(或者可能不會,因爲OGNL執行表達式緩存)。