java.lang.reflect.Method
线程是否安全?
我的程序的分析结果显示Class.getMethod()
在多次调用时花费了相当多的计算时间,比我预期的要多一点。
我可以调用一次,并将生成的方法存储在易于访问的地方。
但是,多个Web工作线程将同时使用存储的Method
对象。
这样安全吗?
答案 0 :(得分:6)
如果在多个线程可用之后不更改方法的状态,则可以安全地使用多个线程。您可以在两个线程中调用setAccessible(true)和setAccessible(false),结果将不是线程安全的。然而,这没有什么用处。
简而言之,Method.setAccessible()不是技术上线程安全的,但你应该能够以线程安全的方式使用它。
答案 1 :(得分:4)
保证每个ClassLoader实例只定义一次Java类,因此您可以安全地假设定义(包括方法及其签名)不会随时间发生变化,因此您可以安全地“缓存”它们以供多个线程使用。
但是,请记住,具有相同完全限定名称(包+类名)的类可以通过单独的ClassLoader实例进行不同的定义。
答案 2 :(得分:0)
类定义不会改变,所以除非你在不同的线程中加载不同的类(比如说来自不同的库),否则Method对象应该是线程安全的。 (当然,反射调用方法本身是否是线程安全的是一个不同的问题。)