java.lang.reflect.Method线程安全吗?

时间:2011-03-18 07:59:01

标签: java

java.lang.reflect.Method线程是否安全?

我的程序的分析结果显示Class.getMethod()在多次调用时花费了相当多的计算时间,比我预期的要多一点。 我可以调用一次,并将生成的方法存储在易于访问的地方。 但是,多个Web工作线程将同时使用存储的Method对象。

这样安全吗?

3 个答案:

答案 0 :(得分:6)

如果在多个线程可用之后不更改方法的状态,则可以安全地使用多个线程。您可以在两个线程中调用setAccessible(true)和setAccessible(false),结果将不是线程安全的。然而,这没有什么用处。

简而言之,Method.setAccessible()不是技术上线程安全的,但你应该能够以线程安全的方式使用它。

答案 1 :(得分:4)

保证每个ClassLoader实例只定义一次Java类,因此您可以安全地假设定义(包括方法及其签名)不会随时间发生变化,因此您可以安全地“缓存”它们以供多个线程使用。

但是,请记住,具有相同完全限定名称(包+类名)的类可以通过单独的ClassLoader实例进行不同的定义。

答案 2 :(得分:0)

类定义不会改变,所以除非你在不同的线程中加载不同的类(比如说来自不同的库),否则Method对象应该是线程安全的。 (当然,反射调用方法本身是否是线程安全的是一个不同的问题。)