首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java反射中的构造函数类线程安全

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

Stack Overflow用户
提问于 2013-04-03 18:53:07
回答 2查看 1.4K关注 0票数 1

使用Java 反射,可以实例化类的对象,甚至可以通过私有构造函数实例化,例如

代码语言:javascript
复制
public class MyClass
{
    private MyClass(Object p1, String p2)
    {
        // Constructor with no modifications to static code
    }
}

可以这样做(在同一类或任何其他类中,为简化而省略的异常处理)

代码语言:javascript
复制
public static final Constructor myClass;

static
{
    myClass = MyClass.class.getConstructor(Object.class, String.class);
    myClass.setAccessible(true);
}

然后创建MyClass的新实例,如

代码语言:javascript
复制
    myClass.newInstance(new Object(), "Test");

以上对newInstance()线程的调用是否是安全的,因为myClass是静态的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-03 20:02:50

调用Constructor.newInstance()似乎并不是严格的线程安全;至少在我的openjdk-6实现中,我发现一个类sun.reflect.NativeConstructorAccessorImpl有一个定义为private int numInvocations;的字段,稍后在这一行代码:if (++numInvocations > ReflectionFactory.inflationThreshold()) {中,它的行为肯定与预期不同。

另外,在Constructor类本身中,acquireConstructorAccessor()方法被记录为“注意这里没有使用同步”。

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

显然,您仍然可以在实例构造函数中处理所做的事情。

票数 4
EN

Stack Overflow用户

发布于 2013-04-03 18:58:58

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15795637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档