美文网首页
this引用逸出

this引用逸出

作者: 囧略囧 | 来源:发表于2018-10-19 16:49 被阅读0次
public class ThisEscape {
  public ThisEscape(EventSource source) {
    source.registerListener(new EventListener() {
      public void onEvent(Event e) {
        doSomething(e);
      }
    });
  }

  void doSomething(Event e) {
  }

  interface EventSource {
    void registerListener(EventListener e);
  }

  interface EventListener {
    void onEvent(Event e);
  }

  interface Event {
  }
}

这将导致this逸出,所谓逸出,就是在不该发布的时候发布了一个引用。在这个例子里面,当我们实例化ThisEscape对象时,会调用source的registerListener方法,这时便启动了一个线程,而且这个线程持有了ThisEscape对象(调用了对象的doSomething方法),但此时ThisEscape对象却没有实例化完成(还没有返回一个引用),所以我们说,此时造成了一个this引用逸出,即还没有完成的实例化ThisEscape对象的动作,却已经暴露了对象的引用。其他线程访问还没有构造好的对象,可能会造成意料不到的问题。

最后,书里面给出了正确构造过程:

public class SafeListener {
  private final EventListener listener;

  private SafeListener() {
    listener = new EventListener() {
      public void onEvent(Event e) {
        doSomething(e);
      }
    };
  }

  public static SafeListener newInstance(EventSource source) {
    SafeListener safe = new SafeListener();
    source.registerListener(safe.listener);
    return safe;
  }

  void doSomething(Event e) {
  }

  interface EventSource {
    void registerListener(EventListener e);
  }

  interface EventListener {
    void onEvent(Event e);
  }

  interface Event {
  }
 }

在这个构造中,我们看到的最大的一个区别就是:当构造好了SafeListener对象(通过构造器构造)之后,我们才启动了监听线程,也就确保了SafeListener对象是构造完成之后再使用的SafeListener对象。

对于这样的技术,书里面也有这样的注释:

具体来说,只有当构造函数返回时,this引用才应该从线程中逸出。构造函数可以将this引用保存到某个地方,只要其他线程不会在构造函数完成之前使用它。

相关文章

  • this引用逸出

    这将导致this逸出,所谓逸出,就是在不该发布的时候发布了一个引用。在这个例子里面,当我们实例化ThisEscap...

  • Java并发编程——"this"逸出解决方法的思考

    最近在看《Java并发编程实战》这本书的“3.2 发布与逸出”章节时,对“this”引用在对象构造方法中逸出问题的...

  • 拍你真正喜欢的,这种激情通常会从作品中表现出来。

    出镜@逸月

  • 如何安全发布对象

    发布对象与逸出 发布对象: 使一个对象能够被当前范围之外的代码所使用,例如通过方法返回对象的引用,或者通过公有的静...

  • 发布和逸出

    概念 发布一个对象(publish):使对象能够在当前作用域范围之外的代码中使用; 逸出(escape):当某个不...

  • 11.对象的安全发布

    发布与逸出 发布一个对象的意思是,使对象能够在当前的作用域之外的代码中使用。例如将指向对象的引用保存到其他代码可以...

  • 花|写意

    宣纸怀揣玉帛竹林才会逸情谁,变着法的斜绣那抹单薄的身影风雨交加时一支试管拈出香精——丛恩文字,图写意,禁止引用。

  • 修身篇42:好利害显浅,好名害隐深

    好利者,逸出[1]于道义之外,其害显[2]而浅;好名者,窜入[3]于道义之中,其害隐而深。 [1]逸出:超出,不在...

  • 逸出红尘的修行

    “我做卦师,你做法师吧!你保护我,我守着你,咱俩走南闯北、逍遥江湖,从此云游四海,济世救民……”每每看...

  • (并发二)保障线程安全的底层思路?

    先引入两个概念:发布和逸出 解释:     1.发布:使对象可以在当前作用域外使用     2. 逸出:发布了不该...

网友评论

      本文标题:this引用逸出

      本文链接:https://www.haomeiwen.com/subject/scmeoftx.html