[英]Constructor class thread safety in Java reflection
使用Java
反射 ,甚至可以通过私有构造函数实例化类的对象,例如对于
public class MyClass
{
private MyClass(Object p1, String p2)
{
// Constructor with no modifications to static code
}
}
一个人可以做(在相同或任何其他类中,为简化起见,省略了异常处理)
public static final Constructor myClass;
static
{
myClass = MyClass.class.getConstructor(Object.class, String.class);
myClass.setAccessible(true);
}
然后创建新的MyClass
实例,例如
myClass.newInstance(new Object(), "Test");
鉴于myClass
是静态的,上述对newInstance()
调用是否是线程安全的?
是的,只要类实例对对象的静态上下文没有执行任何非线程安全的操作,则类实例是静态的,并且构造函数是线程安全的。
调用Constructor.newInstance()
似乎并不严格是线程安全的。 至少在我的OpenJDK-6实现我找到一类sun.reflect.NativeConstructorAccessorImpl
具有定义为一个场private int numInvocations;
以及稍后在此代码行上: if (++numInvocations > ReflectionFactory.inflationThreshold()) {
-当然,它的行为可能与预期的一样。
另外,在Constructor
类本身中,方法acquireConstructorAccessor()
记录为“注意此处没有使用同步”。
但是,狡猾的行为似乎并不会导致整体上的意外行为,只会重复/不必要地执行操作,因此,并行调用newInstance()
不会导致某些事情发生。
显然,您仍然可以将实例构造函数中的操作弄乱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.