2011-03-18 158 views
6

java.lang.reflect.Method線程安全嗎?java.lang.reflect.Method線程安全嗎?

我的程序的性能分析結果顯示Class.getMethod()多次調用需要相當長的計算時間,比我預期的要多一點。 我可以調用一次,並將結果方法存儲在易於訪問的地方。 但是,然後,多個Web工作線程將同時使用存儲的對象Method

這是安全嗎?

回答

5

的方法是使用安全翻過多線程提供您使其可用於多後不改變方法的狀態threads.eg你可以在兩個線程中調用setAccessible(true)和setAccessible(false),結果將不是線程安全的。但是這沒有什麼好用的。

簡而言之,Method.setAccessible()在技術上不是線程安全的,但您應該能夠以線程安全的方式使用它。

+0

順便說一下,是不是'setAccessible'安全泄漏?如果某些代碼有權設置可訪問的內容,稍後可以使用另一個代碼並使用私有方法,而無需進行更多的安全檢查。 – 2011-03-18 22:56:05

+0

除非您的SecurityManager阻止它,否則您可以訪問受保護的包本地和私有方法。它通過覆蓋檢查改進了公共方法的訪問性能。 – 2011-03-19 21:55:17

+0

是的,我正在談論一個安裝了安全管理器的案例......以及不同部分代碼的不同特權。但是,我最好打開另一個關於這個問題的問題,而不是使用評論來解決這個無關緊要的問題。 – 2011-03-19 22:07:36

4

Java類保證只爲每個ClassLoader實例定義一次,因此您可以放心地假定定義(包括方法及其簽名不會隨着時間而改變),因此您可以安全地「緩存」它們以供多個線程使用。

但請記住,具有相同完全限定名稱(包+類名)的類可以通過單獨的ClassLoader實例進行不同的定義。

0

類定義不會改變,所以除非你在不同的線程中加載不同的類(例如來自不同的庫),Method對象應該是線程安全的。 (當然,該方法是否本身由反射稱爲是線程安全的是一個不同的問題。)