Java反射中的构造函数类线程安全性

时间:2013-04-03 18:53:07

标签: java reflection constructor thread-safety

使用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");

鉴于newInstance()是静态的,上述调用myClass是否是线程安全的?

2 个答案:

答案 0 :(得分:4)

是的,类实例是静态的,构造函数是线程安全的,只要它没有对对象的静态上下文做任何非线程安全的事情。

答案 1 :(得分:3)

调用Constructor.newInstance()似乎严格线程安全;至少在我的openjdk-6实现中,我找到了一个类sun.reflect.NativeConstructorAccessorImpl,其字段定义为private int numInvocations;,稍后在这行代码中if (++numInvocations > ReflectionFactory.inflationThreshold()) { - 这可能会按预期运行。<登记/> 此外,在Constructor类本身中,方法acquireConstructorAccessor()记录为“请注意,此处未使用同步”。

但是这种狡猾的行为似乎并没有导致整体意外行为,只是重复/不必要地做事,因此并行调用newInstance()不会导致某些事情被搞砸。

显然,你仍然可以搞清楚实例构造函数中的内容。