使用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是静态的?
发布于 2013-04-03 20:02:50
调用Constructor.newInstance()似乎并不是严格的线程安全;至少在我的openjdk-6实现中,我发现一个类sun.reflect.NativeConstructorAccessorImpl有一个定义为private int numInvocations;的字段,稍后在这一行代码:if (++numInvocations > ReflectionFactory.inflationThreshold()) {中,它的行为肯定与预期不同。
另外,在Constructor类本身中,acquireConstructorAccessor()方法被记录为“注意这里没有使用同步”。
但是,不可靠的行为似乎并不会导致一个整体的意外行为,只会重复/不必要地做一些事情,因此并行调用newInstance()不会导致一些事情被搞砸。
显然,您仍然可以在实例构造函数中处理所做的事情。
发布于 2013-04-03 18:58:58
是的,类实例是静态的,构造函数是线程安全的,只要它不对对象的静态上下文执行任何非线程安全的操作。
https://stackoverflow.com/questions/15795637
复制相似问题