2011-03-18 159 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对象应该是线程安全的。 (当然,该方法是否本身由反射称为是线程安全的是一个不同的问题。)