我將從Struts2範圍中重用OGNL庫。我有相當大的一套公式,這就是爲什麼我想預編譯所有的人:OGNL線程安全
Ognl.parseExpression(expressionString);
但我不知道,如果預編譯的表達可以在多線程環境中使用。有誰知道它是否可以使用?
我將從Struts2範圍中重用OGNL庫。我有相當大的一套公式,這就是爲什麼我想預編譯所有的人:OGNL線程安全
Ognl.parseExpression(expressionString);
但我不知道,如果預編譯的表達可以在多線程環境中使用。有誰知道它是否可以使用?
這個PropertyUtils來自OGNL的代碼被寫成線程安全的,所以我猜想編譯的表達式是爲了線程安全的。更進一步的證據是,大多數訪問者API提供了可變狀態作爲上下文參數(例如參見PropertyAccessor),所以這些類本身幾乎沒有可變狀態。不可變類是本質線程安全的。開發人員指南要求擴展是線程安全的,最後通過代碼查看哪裏存在可變狀態,並在同步塊中進行保護,例如參見EvaluationPool。
總之,看起來OGNL的設計是線程安全的。不管它是否真的是另一個問題!你可以寫一個快速測試來確認,例如使用Concutest。或者,如果線程的數量合理,將所有表達式存儲在ThreadLocal中將完全避免該問題,但需要額外的一點內存(或者可能不會,因爲OGNL執行表達式緩存)。
我覺得你最好的選擇是聯繫原開發商,直接或通過郵件列表:
http://www.opensymphony.com/ognl/members.action
https://ognl.dev.java.net/servlets/ProjectMailingListList
該項目似乎放棄了一段時間,因此,幾乎沒有任何人誰知道:/