【问题标题】:Constructor class thread safety in Java reflectionJava反射中的构造函数类线程安全
【发布时间】:2013-04-03 18:53:07
【问题描述】:

使用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() 的调用是线程安全的吗?

【问题讨论】:

    标签: java reflection constructor thread-safety


    【解决方案1】:

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

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

    显然,您仍然可以将实例构造函数中所做的事情搞砸。

    【讨论】:

    • 嗯... Weird.One 会假设 newInstance() 与实际构造函数一样是线程安全的。
    • 嗯,会很好,我同意。但是与直接调用相比,所涉及的代码量明显更多......
    【解决方案2】:

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

    【讨论】:

    • 这也是我的假设。我会澄清这个问题。 +1。
    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多