2013-04-03 214 views
1

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

回答

3

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

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

显然,你仍然可以在事件构造函数中搞砸了什么。

+0

嗯...... Weird.One会假设newInstance()是与实际构造函数一样线程安全的。 – PNS 2013-04-03 21:56:28

+0

好吧,我很同意。但是,与直接调用相比,所涉及的代码量要多得多。 – skirsch 2013-04-04 09:03:19

4

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

+0

这也是我的假设。我会澄清这个问题。 +1。 – PNS 2013-04-03 19:02:53