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



使用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是静态的吗?

调用Constructor.newInstance()似乎不是严格的线程安全;至少在我的openjdk-6实现中,我发现一个类sun.reflect.NativeConstructorAccessorImpl有一个字段定义为private int numInvocations;,然后在这行代码中:if (++numInvocations > ReflectionFactory.inflationThreshold()) { -这当然可能与预期的行为不同。同样,在Constructor类本身中,方法acquireConstructorAccessor()被记录为"注意这里没有使用同步"。

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

显然,在实例构造函数中所做的事情仍然会把事情搞砸。

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

相关内容

  • 没有找到相关文章