代码之家  ›  专栏  ›  技术社区  ›  AntonBoarf

为什么要将实例变量指定给局部变量?

  •  0
  • AntonBoarf  · 技术社区  · 4 年前

    这是我在Spring引导代码中看到的(例如 catch 阻止使用 webServer 变量):

    @Override
    public final void refresh() throws BeansException, IllegalStateException {
        try {
            super.refresh();
        }
    
        catch (RuntimeException ex) {
            WebServer webServer = this.webServer;
            if (webServer != null) {
                webServer.stop();
            }
            throw ex;
        }
    }
    

    为什么不只是做 this.webServer.stop() ?

    局部变量的用途是什么 Web服务器 ?

    3 回复  |  直到 4 年前
        1
  •  5
  •   Mark Rotteveel    4 年前

    任务的主要目的是避免产生 NullPointerException 当 this.webServer 设置为 null 在null检查之后和 webServer.stop() 呼叫

    也就是说,没有局部变量:

    1. 您的线程: this.webServer != null -&燃气轮机;真的
    2. 另一个线程: this.webServer = null
    3. 您的线程: this.webServer.stop() -&燃气轮机;可能导致 空指针异常 (取决于步骤2中更改的可见性,这可能并不总是发生;竞争条件)。

    在其他形式的代码中,与重复引用字段相比,将字段指定给局部变量也有性能优势。

        2
  •  2
  •   Laonel    4 年前

    如果对实例变量执行null检查,则另一个线程可能会将其置为null this.webServer 在检查为null之后但之前 webServer.stop(); 被调用。 This answer 很好地描述了这种行为。

        3
  •  1
  •   Mark Rotteveel    4 年前

    如果您在多线程环境中工作,那么同一变量对于线程可能具有不同的值。在这种情况下,如果代码env没有同步,您将得到一个NPE。

    如果要使用 this.webServer.stop() ,确保在此变量上的读写操作在每个位置都是同步的,否则请按照建议使用局部变量。