如果在空检查后发生关闭,则复制引用以避免NPE?

时间:2017-12-14 03:34:16

标签: java apache-commons-dbcp

这是commons-dbcp2的源代码,为什么它可以避免NPE?

public int getNumActive() {
    // Copy reference to avoid NPE if close happens after null check
    GenericObjectPool<PoolableConnection> pool = connectionPool;
    if (pool != null) {
        return pool.getNumActive();
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

请注意,变量connectionPool已复制到新变量pool中。当存在多线程*的可能性并且原始变量(connectionPool)被不同的线程覆盖/清除时,使用这种复制引用和使用新引用的模式。

在这种情况下,如果有两个线程,一个调用close方法和另一个调用getNumActive方法,则第一个close方法可能会清除connectionPool变量,然后getNumActive方法尝试运行。

如果发生这种情况,那么即使原始变量清除,其副本(pool)仍然存在。因此pool.getNumActive();永远不会导致NPE

*非常草率的