java.lang.reflect.Method调用线程安全吗
我使用org.apache.commons.beanutils.PropertyUtils.getPropertyDescriptors(对象)获取PropertyDescriptor[],并使用readMethod获取值 getPropertyDescriptors将从缓存中获取方法 因此,对于多线程中的特定类和字段,只有一个方法实例调用invoke() 如果对象的方法是线程安全的,可以在多线程中调用一个方法。invoke()吗?java.lang.reflect.Method调用线程安全吗,java,multithreading,Java,Multithreading,我使用org.apache.commons.beanutils.PropertyUtils.getPropertyDescriptors(对象)获取PropertyDescriptor[],并使用readMethod获取值 getPropertyDescriptors将从缓存中获取方法 因此,对于多线程中的特定类和字段,只有一个方法实例调用invoke() 如果对象的方法是线程安全的,可以在多线程中调用一个方法。invoke()吗? PropertyDescriptor[] pr
PropertyDescriptor[] propertyDescriptors = PropertyUtils.getPropertyDescriptors(object);
propertyDescriptors[0].getReadMethod().invoke(object)
如果userInfo的每个函数都是线程安全的,()->方法[0]。调用(userInfo))在多线程中运行是否正常
Method[] methods = UserInfo.class.getMethods();
for (int i = 0; i < 10; i++ ) {
new Thread(
() -> methods[0].invoke(userInfo))
.start();
}
Method[]methods=UserInfo.class.getMethods();
对于(int i=0;i<10;i++){
新线程(
()->方法[0]。调用(userInfo))
.start();
}
如果一个方法只使用堆栈变量,那么它是线程安全的。堆栈变量的作用域是有限的
查看的源代码,我只看到堆栈变量
因此,PropertyUtils.getPropertyDescriptors
是线程安全的
。。。但是你的问题是关于java.lang.reflect.Method
,我看到它依赖于java.lang.reflect.Method
方法
类没有静态成员,只有位于堆栈上的实例成员。所有的方法都是相似的<代码>方法也没有静态成员的子类<代码>可执行文件实现了它,它还有两个静态代码部分,只有在JVM启动时才会调用:
静态{
//AccessibleObject在初始阶段1的早期初始化
setJavaLangReflectAccess(新ReflectAccess());
}
静态void checkPermission(){
SecurityManager sm=System.getSecurityManager();
如果(sm!=null){
//SecurityConstants.ACCESS\u权限用于检查
//客户机是否有足够的权限击败Java
//语言访问控制检查。
sm.checkPermission(SecurityConstants.ACCESS\u权限);
}
}
AccessibleObject
扩展了无静态成员的AnnotatedElement
总之,我相信java.lang.reflect.Method
是线程安全的
java.lang.reflect.Method调用线程安全吗
Mike暗示了这一点,但简单的回答是调用方法。invoke(…)
是线程安全的,当且仅当方法本身是线程安全的。这意味着if不能更改对象中的任何字段,也不能引用对象中的任何非最终字段
方法.invoke(…)
反射实际上没有什么特别之处。从线程安全的角度来看,直接从多个线程调用该方法会受到同样的审查。为什么不呢?该方法本身不修改任何内容,因此如果涉及多个线程,则不会出现任何错误。或者您是否担心PropertyDescriptor和相关方法?如果是这样,这是一个单独的问题。@Clashsoft我确信PropertyUtils.getPropertyDescriptors(对象)是线程安全的。方法调用将延迟init methodAccessor。但它应该是线程安全的。methodAccessor作为方法的字段。但是对于一个类和一个方法,每个方法实例都使用相同的methodAccessor实例。我认为Mehod.invoke也是线程安全的。在给定的类中,非静态成员都可以引用相同的对象,并且仍然是类型安全的。它们彼此隔离,因为它们是独立的实例。对于同一个类,在不同的时间调用PropertyUtils.getPropertyDescriptors,将从缓存中返回相同的方法实例。同一个方法实例将在多线程中调用invoke()。我不明白你想说什么我编辑了这个问题。我的意思是()->方法[0]。在多线程中运行invoke(userInfo))是可以的,谢谢?