繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM