首页 > 解决方案 > Object Publication 和 Escape Java concurrency ,这个引用是如何在这里转义的?

问题描述

最近在看《Java Concurrency in practice》,遇到了 Publication 和 Escape 的例子,看了好几遍还是觉得没有完全看懂这个例子。

内容所有者规范

public class ThisEscape{
       public ThisEscape(EventSource source){
            source.registerListener(
              new EventListener(){
                 public void onEvent(Event e){
                   doSomething(e);
                 }
              }
            )
       }
}

ThisEscape 说明了 Escape 的一个重要特殊情况 - 当this引用在构造过程中转义时。当内部的 EvenListener 实例被发布时,封闭的 ThisEsape 实例也是如此。但是对象只有在其构造函数返回后才处于可预测的一致状态。因此,从其构造函数中发布一个对象可能会发布一个构造不完整的对象。即使发布是构造函数中的最后一条语句也是如此。如果 this 引用在构造过程中转义,则认为该对象构造不正确。

ThisEscapecosntructor 正在向 EventListener 注册一个 EventSource,我们在其中指定一个传递 Event 实例的 onEvent 行为。但是在这里我假设对象构造的顺序是EventListener --> ThisEscape这样的this引用如何ThisEscape被传递到这里来逃避?

标签: javaobjectconcurrencysafe-publication

解决方案


我认为我们应该参考这段摘录:

当内部的 EvenListener 实例被发布时,封闭的 ThisEsape 实例也是如此。

这让我觉得doSomething()它是一个方法ThisEscape(否则引用不会逃逸),意思ThisEscape是一个监听器EventSource,它在构造过程中通过覆盖EventListeneronEvent方法注册自己。

简单来说就是:“当有新事件发生时,调用doSomething()”。

在这一点上,问题很简单。想象一下,我们在ThisEscape's 的构造函数中注册了一个新的监听器......并且立即......一个事件发生了!当一个线程仍在构建ThisEscape时,另一个线程已经在调用doSomething(),这可能会导致非常不可预测的结果......


推荐阅读