zoukankan      html  css  js  c++  java
  • this引用的逸出

    this引用逸

    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引用保存到某个地方,只要其他线程不会在构造函数完成之前使用它。

  • 相关阅读:
    一步一步学习IdentityServer4 (4) 处理特殊需求之-登录等待页面
    php 打包下载
    nginx https反向代理tomcat
    the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf
    layui配置
    vue 学习一
    MyCAT+MySQL 搭建高可用企业级数据库集群——第3章 MyCat核心配置讲解
    第一模块·开发基础-第3章 作业讲解
    《扭转人生的40个哲学提问》 徐帆 著
    零基础学 JavaScript 全彩版 明日科技 编著
  • 原文地址:https://www.cnblogs.com/wcss/p/13073965.html
Copyright © 2011-2022 走看看