相关疑难解决方法(0)

什么是"未完全构建的对象"?

Goetz的Java Concurrency in Practice,第41页提到了this在构造过程中引用如何逃脱.一个"不要这样做"的例子:

public class ThisEscape {
    public ThisEscape(EventSource source) {
        source.registerListener(
            new EventListener() {
                public void onEvent(Event e) {
                    doSomething(e);
                }
            });
    }
}
Run Code Online (Sandbox Code Playgroud)

this是通过doSomething(e)引用封闭ThisEscape实例的事实"逃避" .可以通过使用静态工厂方法(首先构造普通对象,然后注册侦听器)而不是公共构造函数(完成所有工作)来解决这种情况.这本书继续:

从构造函数中发布对象可以发布未完全构造的对象.这是真实的,即使是公布在构造函数中的最后一条语句.如果this参考在构造期间逃逸,则认为该对象未正确构造.

我不太懂.如果发布是构造函数中的最后一个语句,那么之前没有完成所有构建工作吗?怎么会是this由当时不是有效?显然有一些伏都教在那之后继续,但是什么?

java concurrency publishing this

25
推荐指数
2
解决办法
1689
查看次数

最终字段和线程安全

它应该是有目的不可变的java类'final'的所有字段,包括超级字段,以便是线程安全的,还是没有修饰符方法?

假设我有一个非最终字段的POJO,其中所有字段都是某些不可变类的类型.这个POJO有getter-setters,以及一个构造函数,它设置了一些初始值.如果我使用敲除修饰符方法扩展此POJO,从而使其不可变,扩展类是否是线程安全的?

java immutability thread-safety

8
推荐指数
1
解决办法
8565
查看次数