3

我在构造函数中实例化了一个内部类,但我没有使用它来启动线程或作为事件侦听器。例如:

public class Something {

    final InnerSomething innerSomething = new InnerSomething();

    public Something(Param arg) {
        super(arg);
    }

    private class InnerSomething {...}

    ...
}

编辑:我从其他地方复制并粘贴了代码,忘记删除“抽象”关键字。

EDIT2:“'this'引用转义”的“我的”定义是在Java Concurrency in Practice一书中找到的。

使用上面的代码,我是否允许“this”引用“escape”?

4

2 回答 2

7

从技术上讲,您InnerSomething将参考this before Something的构造函数返回。

但是,如果您不发布引用并且不在InnerSomething's 的构造函数中对其进行任何操作,则不会产生问题。请注意,最好将innerSomething私有标记为可以this通过 package-private 字段访问。

如果您参考 JCiP #3.2.1,他们声明:

更具体地说,this在构造函数返回之前,引用不应从线程中逃脱。构造函数可以将this引用存储在某个地方,只要它在构造之后才被另一个线程使用。

于 2013-06-11T13:43:50.703 回答
1

我不相信。“Escape”意味着对可变的私有引用的公共访问。我在您发布的代码中看不到这一点。

我们同意这个词的含义吗?

于 2013-06-11T13:43:11.013 回答